Blinn-phong着色......?
所以我所拥有的问题,正如上面的图像所希望的那样,是我似乎无法让我的镜面高光变得平滑。问题是沿着脸部边缘的突然切断,这不应该发生。漫反射光照似乎工作得很好,它使用相同的插值。这是blinn-phong镜面高光的代码:
vec3 halfAngle = normalize(lightDirection.xyz + viewRay);
float blinnTerm = dot(normal.xyz, halfAngle);
blinnTerm = clamp(blinnTerm, 0.0f, 1.0f);
blinnTerm = pow(blinnTerm, 300.0f);
float specIntensity = intensity * blinnTerm;
vec4 specColour = specIntensity * specColour;
lightDirection
是恒定的,它是无限远的(即太阳)。对于viewRay,它使用投影矩阵在顶点着色器中计算:
viewRay = vec3(-(UV.x * 2.0f - 1.0f) / projection[0].x,
-(UV.y * 2.0f - 1.0f) / projection[1].y,
1.0f);
我正在使用延迟渲染,这是UV值的来源(渲染为全屏纹理)。
我唯一能想到的是普通插值不够平滑。但如果是这样的话,我该如何解决呢? (我将法线存储为16位浮点数,但将其加到32位并没有什么区别。)
答案 0 :(得分:2)
现在茶壶已经修好了! 是插入法线的问题,但幸运的是,这是一个简单的修复;我正在对顶点着色器中的法线进行标准化,然后进行插值,而不是先插值然后进行标准化。它仍然不完美,但它肯定是一种改进!
这里的教训:如果你的图像看起来很平坦,你可能正在做一些你不应该在顶点着色器中做的事情。