cg基本语法
基本类型表达式
- 语法和C语言类是,有对应的编译器,程序是给显卡运行;
- 可以从渲染流水线中获得对应的输入;3:指定的输出能流入下一个流水线模块;
- 操作符号和C语言一样,可以使用+,,*/<,>,<=,>=等运算;
- Cg提供了float half double浮点类型;
- Cg支持定点数fixed来高效处理某些小数;
- Cg使用int来表示整数;I
- bool 数据类型来表示逻辑类型;
- sampler*,纹理对象的句柄,sampler/1D/2D/3D/CUBE/RECT
- 内置向量数据类型:float4f(float,float,float,float),向量长度不能超过4;
- 内置矩阵数据类型:float1x1 float2x3 float4x3 float4x4;不能超过4x4;
- 数组类型float a[10];10个float,float4 b[10],10个float4;
- 语义绑定float4 a:POSITION,返回值也可以语义绑定;
fixed定点数通过整数的形式来处理浮点数,可以避免浮点数的误差。
结构体与语义
1 2 3 4 5
| struct name{ 类型 名字; 返回值函数名称(参数){ };
|
输入语义与输出语义:
语义:一个阶段处理数据,然后传输给下一个阶段,那么每个阶段之间的接口,例如:顶点处理器的输入数据是处于模型空间的顶点数据(位置、法向量),输出的是投影坐标和光照颜色;片段处理器要将光照颜色做为输入;C/C++用指针,而Cg通过语义绑定的形式;
- 输入语义:绑定接收参数,从上一个流水线获得参数;
- 输出语义:绑定输出参数到下一个流水线模块;
- 语义:入口函数上有意义(顶点着色入口,像素着色入口),普通的函数无意义;
标准内置函数
- abs(num)绝对值;
- 三角函数;
- cross(a,b)两个向量的叉积;
- determinant(M)矩阵的行列式;
- dot(a,b)两个向量的点积;
- floor(x)向下取整;
- lerp(a,b,f)在a,b之间线性插值;
- log2(x)基于2为底的x的对数;
- mul(m,n):矩阵x矩阵,矩阵x向量,向量×矩阵;
- power(xy)x的y次方;11:radians(x)度转弧度;
- reflectfv,n)v关于法线n的反射向量;
- round()靠近取整;
- tex2D(smaple,x)二维纹理查找
- tex3Dproj(smaple,x)投影三维纹理查找;
- texCUBE 立方体贴图纹理查找;
- distance() 计算点的距离;
Unity自带函数
- 引用Unity自带的函数库:#include”UnityCG.cginc”Unity->Edit->Data->CGlncdudes;
- TRANSFORM_TEX:根据项点的纹理坐标,计算出对应的理的真正的UV坐标;
- 使用属性的委量:在shader里面需要使用属性变量还需要在shader中定义一下这个变量的类型和名字;名字要保持一致;
- 外部修改shader的编辑器上的参数值;
定点片元shader实例
float4 fixed4_Time
- float4是内置向量(xy,z,w);float4 a;访问单独成员a.x,a.y,a.z,a.w;
- fixed4是内置向量(r,g,b,a);fixed4c;color.r,color.g,color.b,color.a;
- float3是内置向量(x,y,z);
- fixed3是内置向量(r,g,b);
- float2是内置向量(x,y);
- _Time:自场景加载开始所经过的时间,4个分量分别是(t/20,t,t2,t3);
- _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),平滑时间,防止时间间隔起伏太大;
正弦波
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 64 65 66 67 68
| Shader "Custom/SineShader" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100
Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag
#include "UnityCG.cginc"
struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; };
struct v2f { float4 vertex : POSITION; float2 uv : TEXCOORD0; };
sampler2D _MainTex; float4 _MainTex_ST;
v2f vert (appdata v) { v2f o; float dist = distance(v.vertex.xyz,float3(0,0,0)); float h = sin(dist + _Time.z);
o.vertex = mul(unity_ObjectToWorld,v.vertex);
o.vertex.y = h;
o.vertex = mul(unity_WorldToObject,o.vertex);
o.vertex = UnityObjectToClipPos(o.vertex); o.uv = TRANSFORM_TEX(v.uv,_MainTex); return o; }
fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv);
return col; } ENDCG } } }
|
UV动画
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 64
| Shader "Custom/UVShader" { Properties { _MainTex ("Texture", 2D) = "white" {} _SubTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100
Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag
#include "UnityCG.cginc"
struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; };
struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; };
sampler2D _MainTex; sampler2D _SubTex; float4 _MainTex_ST;
v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; }
fixed4 frag (v2f i) : SV_Target { float2 uv_offset = float2(0,0); uv_offset.x = _Time.y * 0.25; uv_offset.y = _Time.y * 0.25;
fixed4 light_color = tex2D(_SubTex,i.uv + uv_offset); fixed4 col = tex2D(_MainTex, i.uv) + light_color;
return col; } ENDCG } } }
|