2015-04-03 2 views
2

В настоящее время у меня есть рабочая сцена в LWJGL, которая создает кучу вокселей. Я использую VBO со всеми вершинами, нормалями и цветами геометрии и glDrawArrays(), которые отображаются на экране.LWJGL Как визуализировать SSAO

У меня есть поиск по всему Google для того, как визуализировать мою сцену с помощью SSAO или Screen-Space Ambient Occlusion. Почти все результаты, которые я нахожу, просто детализируют код 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 на экране, а затем получить текстуру текстуры глубины?

И что такое texture1? Моя программа использует только цвета, а не текстуры, поэтому я понятия не имею, что это может быть.

ответ

0

Я бы предоставил его дополнительному FBO и получил текстуру глубины (вам нужна текстура глубины, а не буфер глубины!) Id. Затем вы можете легко загрузить его в шейдер.

Смежные вопросы