1.1.语义
接着上一篇我们继续
a.顶点着色器的输入语义。(不是输出)
输入参数给到顶点函数,输入的参数需要填充一个语义,用于表示所传递的数据。
下面是顶点着色器输入语义:
语义 | 描述 |
POSITION | 顶点的坐标信息,通常为float3或者float4类型 |
NORMAL | 顶点的法线信息,通常为float3类型 |
TEXCOORD0 | 模型的第一套UV坐标,通常为float2、float3或者float4类型,TEXCOORD0到TEXCOORD3分别对应为第一到第四套UV坐标 |
TANGENT | 顶点的切向量,通常为float4类型 |
COLOR | 顶点的颜色信息,通常为float4类型 |
注意事项:
当顶点信息包含的元素少于顶点着色器输人所需要的元素时,缺少的部分会被0填充,而W分量会被1填充。例如:项点的 UV 坐标通常是二维向量,只包含x和y元素。如果输人的语义 TEXCOORD0 被声明为float4 类型,那么顶点着色器最终获取到的数据将变成(x,y,0,1)。
b.顶点着色器的输出和片段着色器输入语义。(顶点的输出 片段的输入!)
一个渲染流程分为三个阶段:应用阶段、几何阶段、光栅化阶段。
在应用阶段最重要是输出渲染所需的几何数据,也就是渲染图元,渲染图元可以是点、线和三角面。这些数据会传到下一阶段,即几何阶段。
在几何阶段通过对输入的渲染图元处理,如 顶点着色器(空间变换、顶点着色等)、曲面细分着色器、几何着色器、裁剪、屏幕映射;输出屏幕空间的二维顶点坐标、对应的深度、着色等信息传递给下一阶段光栅化阶段。
光栅化阶段主要是决定每个渲染图元中的那些像素会被绘制在屏幕上,对上一阶段的逐顶点数据(纹理、顶点颜色)进行插值。(这三个阶段是概念流水线,只是做了基本的功能划分。)
下面是渲染流程三阶段(概念阶段):
图形渲染流水线以顶点数据作为开始,当GPU获取到CPU传递的顶点数据之后,图形渲染流水线正式开始执行。
下面是部分GPU渲染流水线:
在整个渲染流水线中,顶点着色器需要输出顶点在裁切空间中的坐标,这样GPU就可以知道顶点在屏幕上的光栅化位置及深度值。在顶点函数中输出参数使用float4类型的SV_POSITION语义进行填充。
根据上面提到到渲染流程三阶段,顶点着色器输出的值将会在光栅化阶段,对逐顶点数据(纹理、顶点颜色)插值计算,最终作为像素值输入到片段着色器。也即 顶点着色器的输入也可以成为片段着色器的输入。
温馨提示: 这就解释了有些Shader的片段函数中只有输出参数,没有输入参数。
下面是顶点着色器输出和片段着色器输入常用的语义:
语义 | 描述 |
SV_POSITION | 顶点在裁切空间中的坐标,float4类型 |
TEXCOORD0、TEXCOORD1 等 | 用于声明任意高精度的数据,例如纹理坐标、向量等 |
COLOR0、COLOR1 | 用于声明任意低精度的数据,例如颜色、数值区间[0,1]的变量 |
特别提醒 | TEXCOORDn 或者 COLORn 不特指UV和颜色,语义范围只包括但不限于此。忘各位仁兄不要受骗。 |
在顶点和片段着色器的输入和输出参数后被冒号:隔开的就是语义,语义所代表的是需要传递的数据。那么如何才能在CG代码块中调用属性变量,如何起到关联作用,最终在属性面板中做调整得到想要的效果。这涉及到在CG中调用Proprieties代码块声明,做到Shader程序可访问这些属性,需要在CG代码块中再次声明。
关于CG中声明属性变量,会在下一篇进行补充。