2015-04-03 75 views
2

我目前在LWJGL中有一個工作場景,它呈現一堆體素。我正在使用一個VBO,它包含幾何體和glDrawArrays()的所有頂點,法線和顏色。LWJGL如何呈現SSAO

我已經在谷歌搜索瞭如何渲染我的場景與SSAO或屏幕空間環境光遮擋。我找到的幾乎所有結果都只是詳細說明了我需要的GLSL代碼,但完全省略了所需的lwjgl代碼。

這是片段着色器的我發現SSAO(我不記得是誰作者是,或者如果誰張貼有人甚至原作者的人)

uniform sampler2D texture0; 
uniform sampler2D texture1; 

uniform vec2 camerarange; 
uniform vec2 screensize; 

varying vec2 texCoord; 

float readDepth(in vec2 coord) { 
    return (2.0 * camerarange.x)/(camerarange.y + camerarange.x - texture2D(texture0, coord).x * (camerarange.y - camerarange.x)); 
} 


void main(void) 
{ 
    float depth = readDepth(texCoord); 
    float d; 

    float pw = 1.0/screensize.x; 
    float ph = 1.0/screensize.y; 

    float aoCap = 1.0; 

    float ao = 0.0; 

    float aoMultiplier=1000.0; 

    float depthTolerance = 0.0001; 

    d=readDepth(vec2(texCoord.x+pw,texCoord.y+ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    d=readDepth(vec2(texCoord.x-pw,texCoord.y+ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    d=readDepth(vec2(texCoord.x+pw,texCoord.y-ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    d=readDepth(vec2(texCoord.x-pw,texCoord.y-ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    pw*=2.0; 
    ph*=2.0; 
    aoMultiplier/=2.0; 

    d=readDepth(vec2(texCoord.x+pw,texCoord.y+ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    d=readDepth(vec2(texCoord.x-pw,texCoord.y+ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    d=readDepth(vec2(texCoord.x+pw,texCoord.y-ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    d=readDepth(vec2(texCoord.x-pw,texCoord.y-ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    pw*=2.0; 
    ph*=2.0; 
    aoMultiplier/=2.0; 

    d=readDepth(vec2(texCoord.x+pw,texCoord.y+ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    d=readDepth(vec2(texCoord.x-pw,texCoord.y+ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    d=readDepth(vec2(texCoord.x+pw,texCoord.y-ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    d=readDepth(vec2(texCoord.x-pw,texCoord.y-ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    pw*=2.0; 
    ph*=2.0; 
    aoMultiplier/=2.0; 

    d=readDepth(vec2(texCoord.x+pw,texCoord.y+ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    d=readDepth(vec2(texCoord.x-pw,texCoord.y+ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    d=readDepth(vec2(texCoord.x+pw,texCoord.y-ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    d=readDepth(vec2(texCoord.x-pw,texCoord.y-ph)); 
    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier); 

    ao/=16.0; 

    gl_FragColor = vec4(1.0-ao) * texture2D(texture1,texCoord); 
} 

我的問題是一個,我有什麼,我LWJGL空間做沿變量傳遞的

uniform sampler2D texture0; 
uniform sampler2D texture1; 

uniform vec2 camerarange; 
uniform vec2 screensize; 

如果texture0處於2D紋理格式深度緩衝,我將如何創建?

我需要將我的幾何體VBO渲染到屏幕上,然後獲得深度緩衝區紋理的東西嗎?

什麼是紋理1?我的程序只使用顏色而不使用紋理,所以我不知道這可能是什麼。

回答

0

我會將它渲染到一個額外的FBO並獲得深度紋理(您需要深度紋理而不是深度緩衝區!)ID。然後,您可以輕鬆將其加載到着色器。