2015-07-19 28 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