码迷,mamicode.com
首页 > 编程语言 > 详细

Unity中用Shader编程实现3D红心

时间:2014-11-18 00:26:06      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:unity   shader   着色器   红心模型   

有些形状,即使没有3D美术设计师提供模型,也可以用代码生成。

对于想保持原创性不想借用他人模型的独立开发者来说,这无非是一个很重要的途径。

今天献给大家的是用Shader编程实现的一颗红心,寄托下淡淡的思乡情。


最终效果图:

bubuko.com,布布扣    bubuko.com,布布扣


开发环境:Unity 4.5.5


第一步:在原点处创建标准球体

GameObject  ->  Create Other ->  Sphere

(注意:大小是默认的)


第二步:在Shader文件夹中创建HeartShader.shader文件

源代码:

Shader "Custom/Heart"{
	Properties {
		_LightColor("Light Color", COLOR) = (1,1,1,1)
		_DarkColor("Dark Color", COLOR) = (1,1,1,1)
	}
	
	SubShader {
		// vertex
		// fragment
		Pass{
			CGPROGRAM   // -> GPU begin
			
			// define a function  type:vertex name:vert(default)
			#pragma vertex   vert
			
			// define another function type:fragment   name:frag(default)
			#pragma fragment frag
			
			uniform half4 _LightColor;
			uniform half4 _DarkColor;
			
			// typedef vertex struct
			// v2f: vertex to fragment
			struct VertexInput
			{
				fixed4 vertex:POSITION; // must have
			};
			
			struct FragmentInput
			{
				fixed4 pos:SV_POSITION;	// must have
				float4 color:COLOR;
			};
			
			// compute fragment by vertex
			FragmentInput vert(VertexInput i)
			{
				FragmentInput o;
				
				if (i.vertex.y < 0 && abs(i.vertex.z) <= 0.2 && abs(i.vertex.x) <= 0.2){
					i.vertex.y -= 0.12 - sqrt(pow(i.vertex.z,2) + pow(i.vertex.x,2)) * 0.65;
				}
				
				if (i.vertex.y > 0 && abs(i.vertex.z) <= 0.5 && abs(i.vertex.x) <= 0.5) {
					i.vertex.y -= 0.3 - sqrt(pow(i.vertex.z,2) + pow(i.vertex.x,2)) * 0.5;
					if (abs(i.vertex.z) <= 0.2 && abs(i.vertex.x) < 0.48){
						i.vertex.y -= 0.2 - sqrt(abs(i.vertex.z)) * 0.45;
					}
				}
				
				o.pos = mul(UNITY_MATRIX_MVP, i.vertex);
				o.color = _LightColor;
				
				float r = (_DarkColor.r - _LightColor.r) * (1 - i.vertex.y) + _LightColor.r;
				float g = (_DarkColor.g - _LightColor.g) * (1 - i.vertex.y) + _LightColor.g;
				float b = (_DarkColor.b - _LightColor.b) * (1 - i.vertex.y) + _LightColor.b;

				o.color = float4(r,g,b,0.5);
				
				return o;
			}
			
			half4 frag(FragmentInput i):COLOR
			{
				return i.color;
			}
			
			ENDCG  // -> GPU end
		}
	}
	// get the default shader
	FallBack "Diffuse"
}

第三步:给球体添加自定义材质

创建材质,选择 Custom -> Heart  自定义Shader,并将材质添加到第一步创建的球体上


小结:

本篇的重点是实现红心形状,核心代码在顶点着色器部分。

这个Shader着色器色彩渲染处理的比较简单,可以根据实际需要完善色彩渲染。

还有一点需要注意的是,Shader编程生成的模型只是视觉上发生了变化,而起碰撞检测(Collider)依然是原来的(球型)。


Unity中用Shader编程实现3D红心

标签:unity   shader   着色器   红心模型   

原文地址:http://blog.csdn.net/duzixi/article/details/41221647

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!