基本类型表达式
1:语法和C语言类是,有对应的编译器,程序是给显卡运行;
2:可以从渲染流水线中获得对应的输入;
3:指定的输出能流入下一个流水线模块;
4:操作符号和C语言一样,可以使用+,-*/<,>,<=,二=等运算;
5:Cg提供了float half double 浮点类型;
float 单精度浮点
half 半精度浮点
double双精度浮点
7:Cg支持定点数fixed来高效处理某些小数;
8:Cg使用int来表示整数;
9:bool 数据类型来表示逻辑类型;
10:sampler*,纹理对象的句柄,sampler/1D/2D/3D/CUBE/RECT
11:内置向量数据类型:float4(float, float, float, float),向量长度不能超过4;
12内置矩阵数据类型:float1x1 float2x3 float4x3 float4x4;不能超过4x4;
13:数组类型float al10];10个float, float4 b110],10个float4;
14:语义鄉定 float4 a :POSITION,返回值也可以语义绑定;
结构体与语义
1: struct name {
类型 名字;
//尽量不要使用函数;
返回值 函数名称(参数)(/ 如果成员函数里面使用,数据成员,该成员定义在函数体前;
}
};
2:输入语义与输出语义:
语义:一个阶段处理数据,然后传输给卡一个阶段,那么每个阶段之间的接口,例如:顶点
处理器的输入数据是处于模型空间的顶点数据(位置、法向量),输出的是投影坐标和光
照颜色:片段处理器要将光照颜色做为输入;C/C++用指针,而Cg通过语义鄉定的形式;
输入语义:绑定接收参数,从上一个流水线获得参数;
输出语义:绑定输出参数到下一个流水线模块:
语义:入口西数上有意义(顶点着色入口,像素着色入口),普通的函数无意义;
常用语义:
常用语义:
1.POSITION: 获取模型顶点的信息(位置)。
2.TANGENT:获取切线信息。
3.NORMAL: 获取法线信息。
4.TEXCOORD (n 也称UV): 高精度的 从 顶点传递信息 到 片段着色器。(float2 float3 float4)
TEXCOORD0:第一套纹理
TEXCOORD1:第二套纹理
TEXCOORD2:第三套纹理
5.COLOR: 颜色,低精度 从顶点传递信息 到 片段着色器。(float4)
6.SV_POSITION: 表示 已经经过 mvp 矩阵 转换到 屏幕坐标的位置。
7.SV_TARGET: 输出到 哪个 render target、
标准内置函数
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(×) 基于2为底的x的对数;
9:mul(m, n):矩阵x矩阵,矩阵x向量,向量x矩阵;
10:power(x,y)x的y次方;
11: radians(×) 度转弧度;
12:reflect(v, n)v关于法线n的反射向量;
13:round(x) 靠近取整;
14:tex2D(smapler, x)二维纹理查找(x是在纹理上的坐标)
15: tex3Dproj(smapler, x) 投影三维纹理查找
16:texCUBE 立方体贴图纹理查找;
17:distance()计算点的距离;
Unity自带函数
1:引用Unity自带的函数库: #inelide "UnityCG.ceinc• Unity --> Edit --> Data --> CGlncludes:
2:TRANSFORM TEX:根据顶点的纹理坐标,计算出对应的纹理的真正的UV坐标;
3:使用属性的变量:在shader里面需要使用属性变量还需要在shader中定义一下这个变量的类型;
名字要保持一致:
4:外部修改shader的编辑器上的参数值;
代码示例:
Shader "GFSudy/Myshader1"
{
//属性 可以在编辑器中查看和修改
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader
{
Pass{
CGPROGRAM // 插入Cg代码的开始
//定义一个结构体
struct my_struct{
int a;
}; //结尾一定要有分号
//定义一个函数
float sum(float a,float b)
{
return a + b;
}
fixed4 _Color; //首先定义同样名字的变量 才可以访问到
sampler2D _MainTex;
#pragma vertex my_vert // 把my_vert作为顶点Shader的入口
// 如何获取上一个模块的参数呢?: 语义绑定bind 输入输出
float4 my_vert(float4 pos : POSITION) : POSITION
{
return UnityObjectToClipPos(pos);
}
#pragma fragment my_frag // 把my_frag作为片元Shader的入口
fixed4 my_frag():COLOR
{
//return fixed4(1.0,0.0,0.0,1.0); //这里直接把颜色设置为了红色
return _Color; //这里使用属性里的颜色
}
/*fixed4 my_frag(float2 uv:TEXCOORD0):COLOR
{
//return fixed4(1.0,0.0,0.0,1.0); //这里直接把颜色设置为了红色
//return _Color; //这里使用属性里的颜色
return tex2D(_MainTex,uv); //这里使用贴图上的对应uv(也就是2d坐标位置)的纹理
}*/
ENDCG // 插入Cg代码的结束
}
}
FallBack "Diffuse"
}