2014-02-26 38 views
1

Blinn-phong底纹...?没有那么光滑的底纹

Normals 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

我认为你的viewRay计算可能是关闭的。在我的延期渲染器中,我正在从对象的世界位置(G缓冲纹理之一 - 你的UV是否也包含这个纹理?)和相机的世界位置(作为统一传递)来计算视图向量。然后,这些点之间的简单减法将为您提供视图向量。我不遵循viewRay计算的逻辑,也不能说它是否应该起作用。 –

+0

我的第一个想法是,法线没有足够精确地存储,但我看到你有这个覆盖。你使用什么样的视野?对于300镜面反射率来说,这个亮点看起来相当大。 – GuyRT

+0

@ArttuPeltonen viewRay应该是正确的。基本上,我正在做的是将剪辑空间坐标乘以反向透视矩阵以获得相机空间坐标。这使我可以使用深度信息重建位置,从而节省内存带宽(减少一个上传纹理)。 – Fault

回答

2

enter image description here

而且茶壶现在是固定的!有插入法线的问题,但谢天谢地,这是一个简单的修复;我正常化了顶点着色器中的法线,然后进行插值,而不是先插值然后正常化。它仍然不完美,但它肯定是一种改进!

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