Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

顶点着色器和片元着色器的基本结构

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
44
Shader "Lesson20/NewUnlitShader"
{
Properties
{

}
SubShader
{

Pass
{
CGPROGRAM
// 顶点着色器
#pragma vertex myVertex
//顶点着色器 回调函数
//POSITION SV_POSITION 是语义
//POSITION :把模型的顶点坐标填充到输入的参数v中
//SV_POSITION:顶点着色器输出的内容是裁剪空间中的顶点坐标
//如果没有语义来限定输入和输出参数 渲染器不知道用户输出的是什么 就会得到错误的效果
float4 myVertex(float4 v:POSITION):SV_POSITION
{

//将模型顶点空间 转换 到裁剪空间当中
//mul是CG语言提供的矩阵和向量乘法运算的函数(内置函数)
//UNITY_MATRIX_MVP 代表一个变换矩阵 是UNITY内置的模型、观察、投影矩阵的集合
//return mul(UNITY_MATRIX_MVP,v);

//UnityObjectToClipPos() 和矩阵乘法变换是一样的,主要目的就是坐标变换,新版本Unity将其封装起来了
return UnityObjectToClipPos(v);
}
//片元着色器
#pragma fragment myfragment;
//顶点着色器 回调函数
//SV_TAGET 是语义
//SV_TARGET 告诉渲染器,把用户输出的颜色存储到一个渲染目标中,这里将输出到默认的帧缓存中
fixed4 myfragment():SV_TARGET
{
return fixed4(0,1,0,1);
}

ENDCG
}
}
}

顶点片元着色器传递更多参数

1.顶点着色器获取更多的数据信息

主要方式:通过使用结构体对数据进行封装,在结构体中成员变量加语义的方式来定义想要获取的信息

2.片元着色器获取更多的数据信息

主要方式:通过使用结构体对数据进行封装,在结构体中成员变量加语义的方式来定义想要获取的信息 注意 :
片元着色器中获取的数据结构基本上都是由顶点着色器传递过来的 所以我们封装的结构体,还需要作为作为顶点着色器的返回值类型

3.例子

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'


Shader "Lesson20/NewUnlitShader"
{
Properties
{

}
SubShader
{

Pass
{
CGPROGRAM
// 顶点着色器
#pragma vertex vert;
//片元着色器
#pragma fragment frag;
//应用阶段到顶点着色器阶段 命名方式 a2v
struct a2v
{
//顶点坐标(基于模型空间)
float4 vertex:POSITION;
//顶点法线(基于模型空间)
float3 nomal:NORMAL;
//纹理坐标(UV坐标)
float2 uv:TEXCOORD0;
}
//顶点着色器传递给片元着色器
struct v2f
{
//裁剪空间下的坐标
float4 position:SV_POSITION;
//顶点法线(基于裁剪空间)
float3 nomal:NORMAL;
//纹理坐标(UV坐标)
float2 uv:TEXCOORD0;
}
//顶点着色器 回调函数
v2f vert(a2v data)
{
//需要传递给片元着色器的数据
v2f v2fData;
//将模型顶点空间 转换 到裁剪空间当中
v2fData.position = UnityObjectToClipPos(data.vertex);
v2fData.nomal = data.nomal;
v2fData.uv = data.uv;

return v2fData;

}
//顶点着色器 回调函数
fixed4 frag(v2f data):SV_TARGET
{
return fixed4(0,1,0,1);
}

ENDCG
}
}
}

评论