2014-02-26 65 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

而且茶壺現在是固定的!有插入法線的問題,但謝天謝地,這是一個簡單的修復;我正常化了頂點着色器中的法線,然後進行插值,而不是先插值然後正常化。它仍然不完美,但它肯定是一種改進!

這裏的教訓:如果你的圖像看起來平坦,你可能正在做一些你不應該在頂點着色器中做的事情。