Chapter5-SimpleShader-BaseShader
SV_POSITION SV_前缀的变量代表system value SV_POSTION一旦被作为vertex shader的输出,那么这个最终的顶点位置就被固定了(不能tensellate),直接进入光栅化处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| Shader "Custom/Chapter5-SimpleShader" {
SubShader { Pass{ CGPROGRAM
#pragma vertex vert #pragma fragment frag
float4 vert(float4 v : POSITION) : SV_POSITION { return mul(UNITY_MATRIX_MVP, v); }
fixed4 frag() : SV_Target{ return fixed4(1.0,1.0,1.0,1.0); }
ENDCG } } }
|
- vert , 顶点着色器代码, 逐顶点执行, 函数的输入 v 包含了这个顶点的位置, 返回值是该顶点在模型空间中的位置, POSITION : 把模型的顶点坐标填充到输入参数中, SV_POSITION : 顶点着色器的输出是裁剪空间中的顶点坐标
- frag , SV_Target : 把用户的输出颜色存储到一个渲染目标中, 这里将输出到默认的帧缓存中, 片元着色器输出的颜色的每个分量范围是[0,1].
Chapter 5/Simple Shader
加入模型数据
材质的Mesh Render组件提供POSITION, TANGENT, NORMAL数据,在每帧调用Draw Call的时候, Mesh Render组件会把它负责渲染的模型数据发送给Unity Shader.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| Shader "Unity Shaders Book/Chapter 5/Simple Shader" { Properties { _Color ("Color Tint", Color) = (1, 1, 1, 1) } SubShader { Pass { CGPROGRAM
#pragma vertex vert #pragma fragment frag uniform fixed4 _Color;
struct a2v { float4 vertex : POSITION; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; }; struct v2f { float4 pos : SV_POSITION; fixed3 color : COLOR0; }; v2f vert(a2v v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5); return o; }
fixed4 frag(v2f i) : SV_Target { fixed3 c = i.color; c *= _Color.rgb; return fixed4(c, 1.0); }
ENDCG } } }
|