我嘗試基於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/
這是對的嗎? 紋理似乎是正確的,但也許它不是?
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;
正確或錯誤?
謝謝你很多:) – mp87 2012-01-30 16:13:10
因爲我還不能回答我自己的文章: 這裏是結果:http://i42.tinypic.com/35ceko5.jpg – mp87 2012-01-30 16:19:09