有些形状,即使没有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)依然是原来的(球型)。
原文地址:http://blog.csdn.net/duzixi/article/details/41221647