Shader——CG基本语法
可以参考https://blog.csdn.net/linshuhe1/article/details/51670638
基本类型表达式
- 语言保留大部分c语言的特性,有对应的编辑器,程序是给显卡提供的
- 可以从渲染流水线中获得对应的输入;
- 同样指定的输出能流向下一个流水线模块
- 和c一样的基本运算符+,-,/,*,>,<....
- 浮点类型有float,half,double
- 特有的定点数fixed高效处理某些小鼠,比如颜色
- int来表示整数
- bool逻辑类型
- sampler*,纹理,sampler1D/2D/3D/CUBE/RECT
- 内置向量数据,float4(float,flaot,float,float),向量长度不得超过4
- 内置矩阵数据类型float1x1,float2x3,float4x3,float4x4;不得超过4x4
- 数组类型float[10],10个float;float4 b[10],10个float4
- 语义绑定float4:POSITION,返回值也可以语义绑定
结构体
struct myAdd
{
//结构体内变量的定义要在函数前,否则无法使用
float val;
float add(float x)
{
return val + x;
}
};
myAdd s;
输入语义和输出语义
一个阶段处理数据,然后输出给下一个阶段,每个阶段之间的接口就是语义,
比如顶点处理的输入数据就是处于模型空间的顶点数据(位置,法向量),输出的是投影坐标和光照颜色,片段处理器要将光照颜色作为输入
C/C++使用的指针,CG使用的语义绑定
输入语义:绑定接收参数,从上一个流水线获得参数
输出语义:绑定输出参数,到下一个流水线模块
语义在入口函数发挥作用,普通函数无意义
常用语义修饰
- POSITION:位置
- TANGENT:切线
- NORMAL:法线
- TEXCOORD0:第一套纹理
- TEXCOORD1:第二套纹理
- TEXCOORD2:第三套纹理
- TEXCOORD3:第四套纹理
- COLOR:颜色
- ...
标准内置函数
- abs(num):绝对值
- 三角函数
- cross(a,b):两个向量的叉乘积
- determinant(M):矩阵的行列式
- dot(a,b):两个向量的点积
- floor(x):向下取整
- lerp(a,b,f):插值
- log2(x):以2为底x的对数
- mul(m,n):矩阵x矩阵,向量x矩阵,矩阵x向量
- power(x,y):x的y次方
- radians(x):度转弧度
- reflect(v,n)
- round(x)
- tex2D(smaple,x)
- tex3Dproj()
- texCUBE
Unity自带函数
需要引用#include"UnityCG.cginc" 位置:C:Unity->Editor->Data->CGIncludes
TRANSFORM_TEX:根据顶点的为例坐标,计算出对应纹理的真正UV坐标
使用属性的变量:在shander里使用属性变量还需要再shader中定义一下这个变量的类型和名字,名字要保持一致,外部修改shader编辑器上的参数值
float4 fixed4 _Time
- float4是内置向量(x,y,z,w); float4 a;访问单独成员a.x a.y a.z a.w
- fixed4是内置向量(r,g,b,a); fixed4 c;color.r color.g color.b color.a
- float3是内置向量(x,y,z);
- fixed3是内置向量(r,g,b)
- float2是内置向量(x,y)
- _Time是从场景加载开始所经过的时间t,4个分量分别是(t/20,t,t*2,t*3) -> (x,y,z,w)
- _SinTime:t是时间的正弦值,4个分量分别是(t/8,t/4,t/2,t)
- _CosTime:t是时间的余弦值,4个分量分别是(t/8,t/4,t/2,t)
- unity_DeltaTime:dt是时间增量,4个分量分别是(dt,1/dt,smoothDt,1/smoothDt),平滑时间,防止时间间隔起伏太大

浙公网安备 33010602011771号