0%

Hello World

[!TIP] > CGPROGRAM ENDCG # 重要的编译指令 -指定着色器函数 Utility Shader –顶点片元着色器

1
2
3
4
5
使用#pragma声明编译指令
定义实现 顶点/片元着色器 代码的函数名称
#pragma vertex name 顶点
#pragma fragment name 片元

基础数据类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
基础数据类型
uint
int
float f
half 16位浮点数 h
fixed 12位浮点数
bool
string
sampler 纹理对象句柄
sampler
sampler1D
sampler2D
sampler3D
samplerCUBE
samplerRECT


基础复合数据类型
数组: fload arrayf[4]={2,3,4,5}
CG中无法通过length获取数组长度
arrayff[3][3] = {{1,2,3},{4,5,6},{7,8,9}}
struct

特殊数据类型

1
2
3
4
5
6
7
8
9
10
11
向量
数据类型2 = 数据类型2()
数据类型3 = 数据类型3()
数据类型4 = 数据类型4()
矩阵
数据类型‘n’x'm' ={n1m1,n1m2,n1m3......}
bool类型特殊使用
float3 a
float3 b
bool3 c = a<b;
计算结果也是个三维向量,三个个个比较。

Swizzle操作符

上节课我们学习了向量
但是我们并没有讲解如何获取向量中某元素的相关知识点
而这节课将要学习的Swizzle操作符就可以用于获取向量中元素

Swizzle操作符通常以点号(.)的形式使用,后面跟着所需的分量顺序
对于四维向量来说
我们可以通过
向量.xyzw
或
向量.rgba
两种分量的写法来表示向量中的四个值
其中 xyzw和rgba分别代表四维向量中的四个元素
在此的意义就是向量一般可以用来表示坐标和颜色

提取分量

1
2
3
fixed4 f4 = fixed4(1,2,3,4);
fixed f = f4.x;
f = f4.r;

重新排列分量

1
f4 = f4.yzxw

创建新的向量

1
2
fixed3 f3 = f4.xyz;
flxed4 f4_2 = fixed(f3,2);

向量声明矩阵

1
2
3
4
5
flxed4 f4 = fixed4(1,2,3,4)
fixed4x4 f4x4 = {f4,
fixed4(5,6,7,8),
fixed4(9,10,11,12),
f4};

获取矩阵元素

1
2
3
和二维数组一样
float4x4 f4x4;
f = f4x4[0][0];

利用向量获取矩阵中的某一行

1
f4_2 = f4x4[0];

高维转低维

1
2
fixed3 f3_2 = f4;自动取出xyz赋值
f3x3 = f4x4;

运算符相关

c# 短路操作 f<f2||4>5如果f<f2成立,则4>5的比较不会被执行 CG中不存在短路操作 CG中只能对整数取余

CG函数相关

1
2
3
4
5
6
void name(in 参数类型 参数名,out 参数类型 参数名)
{
}
in:输入参数,外部传入内部,不修改该参数
out 输出参数,内部传向外部,在内部必须初始化或者修改
in out 都可以省略

顶点片元着色器基本结构

顶点着色器

1
2
3
4
5
6
7
8
CGPROGRAM
#pragma vertex myVert顶点着色器返回的肯定是个齐次顶点坐标
float4 myVert(float4 v:POSITION):SV_POSITION语义,让系统默认传入一个顶点坐标,传出的是一个裁剪空间坐标
{
return mul(UNITY_MATRIX_MVP,v);变换出在裁剪空间的顶点坐标
UnityObjectToClipPos(v);新版变换矩阵
}
ENDCG

片元着色器

1
2
3
4
5
#pragma fragment myFrag
fixed4 myFrag():SV_Target 告诉渲染器,把用户输出颜色存储到一个渲染目标中,这里输出到帧缓存中
{
return fixed(1,0,0,1);返回红色
}