0%

Unity Shader学习笔记-1-一个最简单的顶点/片元着色器

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);//MVP 是指Model模型 View观察(摄像机) Projection投影
}

fixed4 frag() : SV_Target{
return fixed4(1.0,1.0,1.0,1.0);//白色 每个输出的顶点都会执行一次
}

ENDCG
}
}
}
  1. vert , 顶点着色器代码, 逐顶点执行, 函数的输入 v 包含了这个顶点的位置, 返回值是该顶点在模型空间中的位置, POSITION : 把模型的顶点坐标填充到输入参数中, SV_POSITION : 顶点着色器的输出是裁剪空间中的顶点坐标
  2. 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 {//Application to vertex shader 应用阶段到顶点着色器
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
}
}
}

欢迎关注我的其它发布渠道