有些形状,即使没有3D美术设计师提供模型,也可以用代码生成。
对于想保持原创性不想借用他人模型的独立开发者来说,这无非是一个很重要的途径。
今天献给大家的是用Shader编程实现的一颗红心,寄托下淡淡的思乡情。
最终效果图:
开发环境: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)依然是原来的(球型)。
时间: 2024-10-14 09:25:21