2015-07-19 82 views
-1

我正在实现一个带有简单阴影(ambient + diffuse)的基本高度图。着色在片段着色器上实现,如下所示。像素着色不那么光滑

#version 330 

in vec3 fragNormal; 
out vec4 outColor; 

uniform vec3 lightDirection; 
uniform vec3 lightColor; 
uniform vec3 objectColor; 

void main() 
{ 
    float ambientStrength = 0.1f; 
    vec3 ambientColor = ambientStrength * lightColor; 

    vec3 norm = normalize(fragNormal); 
    float diff = max(dot(norm, -normalize(lightDirection)), 0.0f); 
    vec3 diffuseColor = diff * lightColor; 

    outColor = vec4((ambientColor + diffuseColor) * objectColor, 1); 
} 

我所做的是根据正常的fragNormal计算简单的漫反射分量。该变量直接从顶点着色器传递。

这里是什么,我现在有一个截图:

enter image description here

这是从与像素着色高度图预期的结果? 我有点恼火,表面不光滑。

但是,如果这是预期的,任何技术,改善我目前有什么?

要计算法线,我用下面的算法: Finite difference method (Stack Overflow)

回答

1

使用像素着色器不给你免费的平滑阴影。一般来说,每个三角形只有一个正常的颜色可以让你在屏幕截图中看到平坦的阴影。你想要的是计算每个顶点法线的加权平均值的方法 - 加权的方法真的取决于你(here是一个可能性列表)。

here是一个SO帖子,给出用于查找加权顶点法线的伪代码。

您发布的方法似乎是在高度图上近似法线点的快速方法。 This页似乎表明做了类似的事情(计算点周围法线的总和)以实现类似的平滑效果,同时仍使用有限差分。

+0

奇怪的是,您发布的最后一个链接似乎与我正在实施的算法相同。 – lhahn