2012-01-30 128 views
13

我嘗試基於R5的演示實現屏幕空間環境光遮蔽(SSAO),在這裏找到:http://blog.nextrevision.com/?p=76OpenGL的GLSL SSAO實施

其實我努力去適應他們的SSAO - 線性着色,以適應自己的小引擎。

1)我計算視圖空間曲面法線和線性深度值。

頂點:: 我使用以下着色它們存儲在一個RGBA紋理

varNormalVS = normalize(vec3(vmtInvTranspMatrix * vertexNormal)); 
depth = (modelViewMatrix * vertexPosition).z; 
depth = (-depth-nearPlane)/(farPlane-nearPlane); 
gl_Position = pvmtMatrix * vertexPosition; 

片段:

gl_FragColor = vec4(varNormalVS.x,varNormalVS.y,varNormalVS.z,depth) 

對於我的線性深度計算我簡稱:http://www.gamerendering.com/2008/09/28/linear-depth-texture/

這是對的嗎? 紋理似乎是正確的,但也許它不是?

enter image description here

2)實際SSAO實現: 由於原來如上所述可以在這裏找到:http://blog.nextrevision.com/?p=76

或更快:上引擎收錄http://pastebin.com/KaGEYexK

與此相反的原來我只使用2輸入紋理,因爲我的紋理之一存儲兩個,法線作爲RGB和線性解構als阿爾法。

我的第二個紋理,隨機法線貼圖,看起來是這樣的: http://www.gamerendering.com/wp-content/uploads/noise.png

我使用幾乎一模一樣的實現,但我的結果是錯誤的。

之前細談我想先明確幾個問題:

1)SSAO着色器使用projectionMatrix和它的逆矩陣。

由於它是通過正投影在屏幕對齊的四邊形上呈現的後處理效果,因此projectionMatrix是正交矩陣。正確還是錯誤?

2)組合正常和深度紋理而不是兩個獨立的紋理。

在我看來,這是R5實施和我的實施嘗試之間的最大區別。我認爲這不應該是一個大問題,但是,由於深度紋理不同,這最有可能導致問題。

請注意,R5_clipRange看起來像這樣

vec4 R5_clipRange = vec4(nearPlane, farPlane, nearPlane * farPlane, farPlane - nearPlane); 

原文:

float GetDistance (in vec2 texCoord) 
{ 
//return texture2D(R5_texture0, texCoord).r * R5_clipRange.w; 
const vec4 bitSh = vec4(1.0/16777216.0, 1.0/65535.0, 1.0/256.0, 1.0); 
return dot(texture2D(R5_texture0, texCoord), bitSh) * R5_clipRange.w; 
} 

我不得不承認,我不明白的代碼片段。我深入他存放在我的紋理阿爾法,我想這應該足夠多的只是做這個

return texture2D(texSampler0, texCoord).a * R5_clipRange.w; 

正確或錯誤?

回答

11

你的正常紋理看起來不對。我的猜測是你的vmtInvTranspMatrix是一個模型視圖矩陣。但它應該是模型視圖投影矩陣(注意你需要屏幕空間法線,而不是查看空間法線)。深度計算是正確的。

我實現SSAO一次,通常的紋理看起來是這樣的(注意沒有藍在這裏):

screen space normal

1)SSAO着色器使用projectionMatrix和它的逆矩陣。 由於它是通過正交投影呈現在屏幕對齊的四邊形上的後處理效果,因此projectionMatrix是正交矩陣。正確還是錯誤?

如果你的意思是你正在渲染一個quad來計算實際的SSAO的第二遍,是的。您可以完全避免正交投影矩陣的乘法運算。如果渲染畫面與四[X,Y]的尺寸範圍從-1到1,你可以用很簡單的頂點着色器:

const vec2 madd=vec2(0.5,0.5); 

void main(void) 
{ 
    gl_Position = vec4(in_Position, -1.0, 1.0); 
    texcoord = in_Position.xy * madd + madd; 
} 

2)具有組合的正常和深度紋理,而不是兩個單獨 那些。

不,這不會導致問題。這樣做是常見的做法。

+0

謝謝你很多:) – mp87 2012-01-30 16:13:10

+0

因爲我還不能回答我自己的文章: 這裏是結果:http://i42.tinypic.com/35ceko5.jpg – mp87 2012-01-30 16:19:09