CG框架
基本框架
-
CG必须要有
pass
-
CG作为一个镶嵌的代码段,在unitylab中能够将它作为cg语言进行编译的话,需要关键词
CGPROGRAM
和ENDCG
-
正常代码入口都有main函数,而CG中,这个main函数名字不固定,可以自己起名,但是需要在前部分声明
#pragma
+需要声明的函数种类(比如顶点vertex和片元fragment),而且在shader中声明函数时,必须同时声明顶点和片元,不然不能正常运行
Shader "Custom/111"{
Subshader{
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
void vert()
{
}
void frag()
{
}
ENDCG
}
}
}
此时的shader没有任何意义,是因为数据需要进入顶点shader计算过后,输出到片元shader进行最终的计算,而此时没有任何数据输入输出
CG关键词
in
表述引擎为我们的输入
语义(类似POSITION),是能够被顶点和片元识别的变量的实际意义,就是说明这个变量的用途,:
后面加语义
out
为输出
inout
输入输出,可以接受上一个函数输出的变量,也输出这个给变量
CG语义中COLOR和COLOR0是等价的
void vert(in float2 objPos:POSITION,out float4 pos:POSITION)
{
pos=float4(objPos,0,1);
}
void frag(out float4 col:COLOR)
{
col=float4(1,0,0,1)
}
可以看到,vert的POSITION输出在frag中没有使用,是因为POSITION作为顶点语义输出,是一个非常特殊的语义,不需要直接在片段程序中直接使用它,它会被图形硬件直接做一个正确的处理和显示,所以在frag中我们只需要区关注颜色
也可以这样写
void vert(in float2 objPos:POSITION,out float4 pos:POSITION,out float4 col:COLOR)
{
pos=float4(objPos,0,1);
col=float4(0,0,1,1)
}
void frag(inout float4 col:COLOR)
{
col=float4(1,0,0,1)
}
语义混用
本地坐标通过一系列的转换,成为裁剪空间cvv
(x为-1到1,y为-1到1)
该cube的x范围为-0.5-0.5,y的范围为-0.5-0.5
语义只能描述我们在两个处理程序之间的规范,但是如果数据类型相同是可以互相赋值的
void vert(in float2 objPos:POSITION,out float4 col:COLOR,out float4 pos:POSITION)
{
pos=float4(objPos,0,1);
col=pos;
}
void frag(inout float4 col:COLOR)
{
}
注意如果有两个输出,而下面的 函数又有输入,记得调整输出顺序