[!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 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 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);返回红色 }
|