1、引言
这里我们开始了解CG语言。本篇涉及知识点:
- 输入输出
- 语义
- profile
- 基本数据类型
这里我们使用一个示例来了解一个简单的shader的顶点和片段程序的输入输出以及常用语义。
2、示例
2.1、输入输出和语义
编写一个简单的顶点和片段着色器,代码如下:
Shader "lxt610/fragmentVertexShader"{
SubShader{
pass{
CGPROGRAM
#pragma vertex vert //声明一个顶点着色器
#pragma fragment frag //声明一个片元着色器
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);
}
ENDCG
}
}
}
vertex&fragment
Surface Shader没有pass通道,Vertex & Frament Shader至少有一个pass通道。
Cg是一个镶嵌的代码段,在ShaderLab语法中需要使用关键词“CGPROGRAM”和“ENDCG”将Cg代码段包含起来才能编译使用,需要注意的是这两个关键词都是大写的。
顶点程序会对顶点做一系列的处理,如几何变换,在处理后把需要的数据传递给片段程序,片段程序拿到顶点程序当中处理后的数据继续进行最终的计算。因此一个顶点片元着色器必须同时包含顶点着色器和片元着色器。
”void vert(in float2 objPos:POSITION, out float4 pos:POSITION)”中有两个参数,
- 其中第一个参数中的“in”表示引擎提供的输入,“float2”表示数据的类型为二阶的向量,参数名“objPos”冒号后需要带上语义,语义指的是顶点程序和片段程序能够被识别的变量的实际意义,这里使用“POSITION”。
- 第二个参数中“out”表示输出,数据类型为“float4”,语义也是“POSITION”。
如果顶点程序要输出一个“POSITION”语义的变量,这个变量必须要以“float4”四阶向量的形式。另外,在片段程序中需要有语义为“COLOR”的变量作为输入,这里使用“out float4 col:COLOR”作为颜色变量的输出,语义“COLOR”就是指“COLOR0”。接下来创建一个使用该shader的Material,并