不那么光滑的阴影

时间:2014-02-26 02:14:10

标签: opengl glsl lighting normals specular

Blinn-phong着色......?

Normals 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位并没有什么区别。)

1 个答案:

答案 0 :(得分:2)

enter image description here

现在茶壶已经修好了! 插入法线的问题,但幸运的是,这是一个简单的修复;我正在对顶点着色器中的法线进行标准化,然后进行插值,而不是先插值然后进行标准化。它仍然不完美,但它肯定是一种改进!

这里的教训:如果你的图像看起来很平坦,你可能正在做一些你不应该在顶点着色器中做的事情。