一、像素着色器简介
像素着色器是在对每个像素进行光栅化处理期间运行在图形卡GPU上的一段程序。(不同于顶点着色器,Direct3D不会以软件运算方式来模拟像素着色器。)像素着色器实质上是取代固定功能流水线中的多重纹理(multitexturing)环节,而且赋予了我们直接操纵单个像素以及访问每个像素的纹理坐标的能力。这种对像素和纹理坐标直接访问的能力使得我们能够获得各种各样的特殊效果,例如多重纹理、景深(depth of field)、云彩模拟、火焰模拟以及比较复杂的阴影技术。
二、像素着色器的输入和输出
像素着色器的输入包括每个像素的颜色和纹理坐标,输出为计算所得的每个像素的颜色值。
每个像素的纹理坐标其实就是指定了纹理中将被映射到当前像素的纹理元的坐标(u , v)。在进入像素着色器之前,Direct3D先根据顶点颜色和顶点纹理坐标计算出每个像素的颜色和纹理坐标。输入像素着色器的颜色和纹理坐标对的个数由顶点着色器输出的颜色和纹理坐标对的个数决定。例如,如果一个顶点着色器输出 2 种颜色和 3 个纹理坐标对,则Direct3D将计算出每个像素的 2 种颜色值和 3 个纹理坐标对,并将这些输出结果输入像素着色器。我们需借助语义语法来将输入的颜色和纹理坐标映射为像素着色器程序中的变量。对于上述例子,我们可以写作:
struct PS_INPUT
{
vector c0 : COLOR0;
vector c1 : COLOR1;
float2 t0 : TEXCOORD0;
float2 t1 : TEXCOORD1;
float3 t2 : TEXCOORD2;
}
struct PS_OUTPUT
{
vector finalPixelColor : COLOR0;
}
三、使用像素着色器的步骤
(1)编写像素着色器程序
(2)编译像素着色器程序。
(3)创建一个LPDIRECT3DPIXELSHADER9接口对象,以表示经过编译的着色器代码的像素着色器。
(4)用SetPixelShader方法启用像素着色器。
(5)调用像素着色器的Release方法释放着色器。