代码
我们把上一篇的代码,复制粘贴改一改
瞧,它变成了新的代码
Shader "Custom/NewSurfaceShader"
{
Properties{
}
SubShader
{
pass {
CGPROGRAM
//定义一个顶点处理函数
#pragma vertex vert
//定义一个片段处理函数
#pragma fragment frag
struct a2v {
float4 vertex:POSITION;
float3 normal:NORMAL;
float4 texcoord : TEXCOORD0;
};
struct v2f {
float4 position:SV_POSITION;
float3 color:COLOR0;
};
v2f vert(a2v v) {
v2f f;
f.position = UnityObjectToClipPos(v.vertex);
f.color = v.normal;
return f;
}
fixed4 frag(v2f f) :SV_Target{
return fixed4(f.color,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
解释
我们新定义了两个结构体,名字可以自己起的,但通常都用这个名字.
你是不是想问为什么取了这么个鬼名字?因为…也是老外起的
英语2(two) 和 to发音相同,于是
application to vertex变成了a2v
vertex to fragment变成了v2f
事实上渲染顺序也是a2v从模型空间拿了数据,然后计算之后传给了v2f,v2f计算后传给了系统.
看了第一篇和第二篇的话,下面的结构体和结构体里面的参数代表什么就不用说了.
注意结构体定义{}后面有分号
struct a2v {
float4 vertex:POSITION;
float3 normal:NORMAL;
float4 texcoord : TEXCOORD0;
};
struct v2f {
float4 position:SV_POSITION;
float3 color:COLOR0;
};
然后我们来看看,又对代码动了什么手脚
我们在vert函数中定义了一个返回值f,然后算了一下f.position 也就是传给系统的那个屏幕坐标.
然后f.color=v.normal是什么意思呢,把法线的向量传给了颜色?是的,和英文意思一样,确实是把法线的向量传给了颜色
为什么这么做,以及这么做有什么效果?得先说说法线,就是初中物理光的反射里面那根垂直平面的线,在曲面3D物体里,基本每个点的法线都不一样,所以把法线赋值给颜色的话,效果就是颜色变成了七彩的效果
f中的color是个float3的值,所以我们再加个透明度值为1,返回给SV_Target
大功告成
v2f vert(a2v v) {
v2f f;
f.position = UnityObjectToClipPos(v.vertex);
f.color = v.normal;
return f;
}
fixed4 frag(v2f f) :SV_Target{
return fixed4(f.color,1);
}
效果
第二个效果是fixed(f.color+0.5,1)变得淡了一些