CG语言 C for Graphics语言,C语言面向图形变成语言 前面几张笔记上有详细介绍
CG Profiles
https://developer.nvidia.com/cg-profiles 英伟达官网解释
数据类型
float - 32位元浮点数,一个符号位,(float2(1,1))
half - 16位元浮点数
int - 32位元整数
fixed - 12位元定点数 (可以用于颜色值 fixed4(1,1,1,1))
bool - 真价值 true false (bool?a:b)
sampler* - 代表纹理对象(texture object)
关键词
in 输入
out 输出
inout 输入及输出
例子
//CG代码开始
CGPROGRAM
#pragma vertex vert//顶点 计算函数
#pragma fragment frag //片段像素计算函数
// in 输入 表示模型带来的顶点数据
// float2 二阶的数据类型 (0.1,0.1)
//POSITION 语音表示这个 objPos是位置信息
//out 输出一个 四阶向量 输出给渲染使用
void vert(inout float4 pos : POSITION )
{
// pos = float4(-1,-1,0,1);
//col = fixed4(pos);
}
//inout 输入也输出的数据
//COLOR0 表示 颜色信息表示
void frag(out fixed4 col:COLOR0,in float4 pos:POSITION)
{
half col_1 = 1;
fixed4 col_4 = fixed4(col_1, col_1, col_1, col_1);
col = col_4;// float4(pos);// float4(pos);
//col = float4(0.5, 0, 0, 1);
}
ENDCG//CG代码结束
结构体
//获取模型带来的信息的结构体,
struct appdata
{
float4 vertex : POSITION;//顶点位置信息
float2 uv : TEXCOORD0;//UV信息
float2 uv1 : TEXCOORD1;//UV2信息
};
swizzle操作
CG内的数据类型可以自定义向量类型,类似数组
float是一个浮点类型可以直接这样定义( half,fixed,bool 都支持)
float f2 = float2(1,1);
float3 f3 = float3(1,1,1);
float4 f4=float4(1,1,1,1);
swizzle是的操作是可以默认向量 4个值的字段值为 xyzw | rgba 也就是坐标系或者是颜值
float4 col=float4(f2,0,0);//f2直接可以后面数据拼凑成一个 float4的4阶向量
col=float4(f3.xyz,0)//f3.xyz 可以直接拼接成
col=float4(f3.rgb,0)//这样拼接也是可以的
col=float4(f3.xyg,0)// 这样是不行的 不能混杂获取
类型别名
typedef float4 FL4
FL4 fl4=FL4(1,1,1,1)
矩阵
float2x4 f2x4={1,1,1,1, 2,2,2,2}
float4 f4 = f2x4[0];
数组
不是swizzle 那样操作 只能用下标
float farr[4]={1,2,3,4}
流程语句
if
if(ture)
{
}
else if(true)
{
}
else
{
}
while
while(true)
{
}
do while
i=0;
do
{
i++;
}
while(i<10);
for
for(i=0;i<10;i++)
{
}
注意所有循环次数最大次数是1023,不能大于这个值否则不能使用,也是为了显卡输出性能。
函数
1、CG语言是基于C语言开发的,流程性语言,所以必须先定义再使用否则编译报错
2, 所有参数都是值拷贝传参数,没有指针引用传参,可以使用out 参数类型来使用
例子1
void Func(out float4 col);//前项声明
void Func(out float4 col)
{
}
例子2
float Func2(float arr[3])//函数参数数组长度 必须定义长度
{
float sum=0;
for(int i=0;i<arr.Length;i++)
{
sum+=arr[i];
}
return sum;
}
例子3 公共函数所有shader文件都可以使用
1 创建.cginc 文件,把方法写入到这个文件里
2 shader文件中导入这个文件#include "---/----.cginc" 下面就可使用了
#include "****.****.cginc"
上图是一个unity 自带的cube模型渲染出来的,利用 模型自带的UV信息