顶点着色器:顶点着色器从GPU前段模块(寄存器)中提取图元信息(顶点位置,法向量,纹理坐标),并完成顶点坐标控件转换,法向量控件转换,光照计算等操作,最后将计算好的数据传送到指定寄存器中,然后片段着色器从中获取所要的数据,通常为“”纹理坐标,光照信息等“,并根据这些信息以及从应用程序传递的纹理信息,进行每个片段的颜色计算,最后将处理后的数据送光栅操作模块。
片段着色器:对每个片段进行独立的颜色计算,最后输出颜色值的就是该片段最终显示的颜色。
cg中禁止使用递归函数
1,CG中的变量类型
(1)float float2 float3 float4 32位浮点数
(2)half 16位浮点数
(3)int 32 位整形数
(4)bool
(5)fixed 12定点数 被所有的fragment profiles支持
(6)sampler* 纹理句柄 sampler sampler1D sampler2D sampler3D samplerCUBE samplerRECT
(7)string
1》cg中的关键字 in, out, inout 表示函数的输入参数的传递方式,使用in, out代表图形硬件上不同的寄存器
(1)in, 函数中的输入,(值传递)
(2)out 输出、(值传递)
(3)inout 输入或输出(应用传递)
(4)uniform 修饰的变量 的值是从外部传入与constant相独立,
2> 语义词和语义绑定
(1)表示输入的图元数据含义(位置信息,法向量信息等),表明这些图元数据存放在硬件资源(寄存器或纹理缓冲区)
(2)在顶点或片段着色器中必须有一个和一个语义词的绑定
2》矩阵数据最大不超过 4* 4
一个简单的CG
struct C2E1v_OutPut{
float4 postion:POSITION; //语义
float3 color : COLOR;
};
C2E1v_OutPut_green(){
C2E1v_OutPut out;
out.position = float(position, 0, 1);
out.color = float(0,1,0);
return out;
}
(void surf 参数解释) 详细信息看原文 http://www.cnblogs.com/sifenkesi/p/4678254.html
UnpackNormal 将材质贴图对应的法线 绘制在一张贴图上。将贴图对应点的单位法线向量信息float3(x,y,z) 储存在图对应的颜色里color(r,g,b)里,其中x,y,z分别对应r,g,b。单位法线向量 float3(x,y,z),x,y,z的取值范围是 [-1,1]。在法线贴图中被压缩在
Lambert 光照模型公式为(IM光照模型)
I = Id * K
Id 为环境光强度, K 是材质对光的反射系数, 得到的是漫反射体与环境光交互反射的强度
颜色的范围[0,1]中,所以需要转换