US2S3L8——顶点-片元着色器基本结构

顶点着色器的基本结构

首先需要使用 #pragma vertex​ 来指定实现顶点着色器的函数

最基础的顶点着色器函数要求:

  • 参数类型为 float4​,它代表传入的顶点的坐标,该参数需要由 POSITION​ 语义修饰,它代表**把模型的顶点坐标填充到这个参数当中**

  • 返回值类型为 float4​,它代表经过变换的顶点坐标,返回值需要由 SV_POSITION​ 语义修饰,它代表**输出的内容是裁剪空间中的顶点坐标**

  • 函数内部需要对传入的模型空间的顶点坐标转换到裁剪空间后再返回出去

    可以使用 mul(UNITY_MATRIX_MVP, *)​,其中mul()​是CG提供的内置的矩阵和向量的乘法运算函数,
    UNITY_MATRIX_MVP​ 代表一个变换矩阵,是Unity内置的模型M,观察V,投影P矩阵的集合

    上面的写法是旧写法,在Unity2022内,它将被Unity自动替换为UnityObjectToClipPos(v)​,它是Unity封装的函数,效果是一样的

关于语义是什么,详见:US2S3L9——语义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CGPROGRAM
#pragma vertex myVert //指定实现顶点着色器的函数

//顶点着色器 回调函数
//POSITION 和 SV_POSITION 是CG语言的语义,用于告诉渲染器需要输入什么消息,函数会输出什么消息
//POSITION:把模型的顶点坐标填充到输入的参数v当中
//SV_POSITION:顶点着色器输出的内容是裁剪空间中的顶点坐标
//以上语义会限定输入和输出参数,如果不用语义进行限定,则渲染器将不知道用户输入输出的是什么,就会得到错误的效果
float4 myVert(float4 v : POSITION) : SV_POSITION
{
//return mul(UNITY_MATRIX_MVP, v);
//mul()是CG提供的内置的矩阵和向量的乘法运算函数
//UNITY_MATRIX_MVP 代表一个变换矩阵,是Unity内置的模型M,观察V,投影P矩阵的集合

//mul(UNITY_MATRIX_MVP, *)是旧写法,Unity会自动替换为UnityObjectToClipPos(*),效果是一样的
return UnityObjectToClipPos(v); //假设这里对顶点坐标进行变换,将变换出的顶点坐标返回出去
}
ENDCG

片元着色器的基本结构

首先需要使用 #pragma fragment​ 来指定实现片元着色器的函数

最基础的片元着色器函数要求:

  • 返回值类型为 fixed4​ ,它代表这个片元(像素)的颜色,返回值需要由SV_Target​语义修饰,它代表把用户输出颜色存储到一个渲染目标中

    SV_Target​ 在这里将输出到默认的帧缓存中

  • 函数内部经过处理需要去返回一个 fixed4​ 颜色,表示模型在屏幕上的某个像素显示什么颜色

    最简单的片元着色器可以直接返回一个固定的颜色,相应的使用对应Shader的材质将最终完全显示为这个颜色

1
2
3
4
5
6
7
8
9
10
CGPROGRAM
#pragma fragment myFrag

//片元着色器 回调函数
//SV_Target:告诉渲染器,把用户输出颜色存储到一个渲染目标中,这里将输出到默认的帧缓存中
fixed4 myFrag() : SV_Target
{
return fixed4(1, 0, 0, 1); //假设我们直接让材质全部显示为红色
}
ENDCG

最简单的顶点/片元着色器示例

下面的顶点/片元着色器只完成了让模型空间下的顶点坐标转换到裁剪空间,同时让使用该着色器的材质直接完全显示为某种颜色

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
Shader "TeachShader/Lesson20"
{
Properties { }

SubShader
{
Pass
{
CGPROGRAM
#pragma vertex myVert //指定顶点着色器的实现函数
#pragma fragment myFrag //指定片元着色器的实现函数

//顶点着色器 回调函数
//传入模型空间的顶点,输出裁剪空间下的顶点坐标
float4 myVert(float4 v : POSITION) : SV_POSITION
{
return UnityObjectToClipPos(v); //将传入的模型空间下的顶点坐标转换到裁剪空间下
}

//片元着色器 回调函数
//输出一个固定的颜色,存储到一个渲染目标中,这里将输出到默认的帧缓存中
fixed4 myFrag() : SV_Target
{
return fixed4(1, 0, 0, 1); //让使用该着色器的材质直接完全显示为红色
}
ENDCG
}
}
}

使用该Shader的材质的效果:

image

使用此Shader的材质的模型的显示效果:

image