Answers:
在传统的Blinn / Phong着色中,您可以通过测量表面法线与光线方向之间的夹角的余弦值来计算像素的扩散项。因此,在这种情况下,一个简单的着色器将如下所示:
float DiffuseCoeff(in float3 pos, in float3 normal, in float3 lightPos) {
float3 lightDir = lightPos - pos;
lightDir.normalize();
return max(0.0, Dot(lightDir, normal));
}
在渐变着色中,其想法是通过一维查找纹理来调制漫射系数。根据您在此纹理中放置的内容,可以生成不同的效果。因此,我们用于计算漫射系数的着色器函数变为:
texture1D rampTex;
float DiffuseCoeff(in float3 pos, in float3 normal, in float3 lightPos) {
float3 lightDir = lightPos - pos;
lightDir.normalize();
// Map value from [-1, 1] to [0, 1]
float rampCoord = Dot(lightDir, normal) * 0.5 + 0.5;
return tex1D(rampTex, rampCoord);
}
例如,如果我们要实现一个单元着色器,我们可以做的是生成一个模仿阶跃函数的渐变纹理:
您也可以使用相同的想法为镜面照明生成不同的效果。“渐变”阴影实际上仅是指通过纹理调制阴影值的想法。
编辑:团队要塞2在其渲染中使用渐变着色器。您可以查看本文的详细信息:
http://www.valvesoftware.com/publications/2007/NPAR07_IllustrativeRenderingInTeamFortress2.pdf
在标题为“扩散扭曲函数”的小节的第5部分中查看