2015-04-03 85 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。然后,您可以轻松将其加载到着色器。