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),平滑时间,防止时间间隔起伏太大

 

posted @ 2020-09-07 13:53  密斯塔Joe  阅读(590)  评论(0)    收藏  举报