【Unity】用Shader编程实现3D红心

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

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

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


博文首发地址:

http://blog.csdn.net/duzixi/article/details/41221647


终于效果图:

红心模型(网格)    红心模型


开发环境: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)依旧是原来的(球型)。


原文地址:https://www.cnblogs.com/jzssuanfa/p/6852539.html