cg基本语法

基本类型表达式

视频截图

  1. 语法和C语言类是,有对应的编译器,程序是给显卡运行;
  2. 可以从渲染流水线中获得对应的输入;3:指定的输出能流入下一个流水线模块;
  3. 操作符号和C语言一样,可以使用+,,*/<,>,<=,>=等运算;
  4. Cg提供了float half double浮点类型;
  5. Cg支持定点数fixed来高效处理某些小数;
  6. Cg使用int来表示整数;I
  7. bool 数据类型来表示逻辑类型;
  8. sampler*,纹理对象的句柄,sampler/1D/2D/3D/CUBE/RECT
  9. 内置向量数据类型:float4f(float,float,float,float),向量长度不能超过4;
  10. 内置矩阵数据类型:float1x1 float2x3 float4x3 float4x4;不能超过4x4;
  11. 数组类型float a[10];10个float,float4 b[10],10个float4;
  12. 语义绑定float4 a:POSITION,返回值也可以语义绑定;

  fixed定点数通过整数的形式来处理浮点数,可以避免浮点数的误差。

结构体与语义

视频截图

1
2
3
4
5
struct name{
类型 名字;
//尽量不要使用;
返回值函数名称(参数){//如果成员函数里面使用,数据成员,该成员定义在结构体前;}
};

输入语义与输出语义:
语义:一个阶段处理数据,然后传输给下一个阶段,那么每个阶段之间的接口,例如:顶点处理器的输入数据是处于模型空间的顶点数据(位置、法向量),输出的是投影坐标和光照颜色;片段处理器要将光照颜色做为输入;C/C++用指针,而Cg通过语义绑定的形式;

  • 输入语义:绑定接收参数,从上一个流水线获得参数;
  • 输出语义:绑定输出参数到下一个流水线模块;
  • 语义:入口函数上有意义(顶点着色入口,像素着色入口),普通的函数无意义;

标准内置函数

视频截图

  1. abs(num)绝对值;
  2. 三角函数;
  3. cross(a,b)两个向量的叉积;
  4. determinant(M)矩阵的行列式;
  5. dot(a,b)两个向量的点积;
  6. floor(x)向下取整;
  7. lerp(a,b,f)在a,b之间线性插值;
  8. log2(x)基于2为底的x的对数;
  9. mul(m,n):矩阵x矩阵,矩阵x向量,向量×矩阵;
  10. power(xy)x的y次方;11:radians(x)度转弧度;
  11. reflectfv,n)v关于法线n的反射向量;
  12. round()靠近取整;
  13. tex2D(smaple,x)二维纹理查找
  14. tex3Dproj(smaple,x)投影三维纹理查找;
  15. texCUBE 立方体贴图纹理查找;
  16. distance() 计算点的距离;

Unity自带函数

视频截图

  1. 引用Unity自带的函数库:#include”UnityCG.cginc”Unity->Edit->Data->CGlncdudes;
  2. TRANSFORM_TEX:根据项点的纹理坐标,计算出对应的理的真正的UV坐标;
  3. 使用属性的委量:在shader里面需要使用属性变量还需要在shader中定义一下这个变量的类型和名字;名字要保持一致;
  4. 外部修改shader的编辑器上的参数值;

定点片元shader实例

float4 fixed4_Time

视频截图

  1. float4是内置向量(xy,z,w);float4 a;访问单独成员a.x,a.y,a.z,a.w;
  2. fixed4是内置向量(r,g,b,a);fixed4c;color.r,color.g,color.b,color.a;
  3. float3是内置向量(x,y,z);
  4. fixed3是内置向量(r,g,b);
  5. float2是内置向量(x,y);
  6. _Time:自场景加载开始所经过的时间,4个分量分别是(t/20,t,t2,t3);
  7. _SinTime:t是时间的正弦值,4个分量分别是(t/8,t/4,t/2,t);
  8. _CosTime:t是时间的余弦值,4个分量分别是(t/8,t/4,t/2,t);
  9. 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
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);

return col;
}
ENDCG
}
}
}


UV动画

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
{
// UV 偏移
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);
// sample the texture
// 颜色叠加,通过黑白图实现黑色区域无效果,白色区域高亮
fixed4 col = tex2D(_MainTex, i.uv) + light_color;

return col;
}
ENDCG
}
}
}