2016-12-05 4 views
0

Я работаю над объектом буфера кадров в lwjgl, чтобы сохранить единую текстуру. У меня есть 2 вопроса в настоящее время, первый вопрос является то, что текстура в буфере кадра не кажется, очищая перед визуализацией следующего кадра, как показано ниже (это ореолы правильный термин?):LWJGL - Текстуры буфера кадра

FrameBuffer Texture result

glCheckFrameBufferStatus возвращает GL_FRAMEBUFFER_COMPLETE для этого FBO.

Каждый кадр Отображатель вызовы:

GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); 

перед любым рендеринга происходит на всех (ее первый вызов до того шейдеры выполняются), поэтому я не знаю, почему его ведет этот путь.

Текстуры для фреймбуфера создаются следующим образом:

private int createTexAttachment() 
    { 
     int texture = GL11.glGenTextures(); 
     GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture); 

     GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_RGB32F, WIDTH, HEIGHT, 0, GL11.GL_RGBA, GL11.GL_FLOAT, (FloatBuffer)(null)); 
     GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); 
     GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); 
     GL32.glFramebufferTexture(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, texture, 0); 

     return texture; 
    } 

Когда рендерер достигает FBO рендеринг передать его связывает FBO так:

public void bind() 
    { 
     GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); 
     //ensure an unbound texture 
     GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0); 
     GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBuffer); 
    } 

и тогда несвязанные после сдавать с:

public void unbind() 
    { 
     GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0); 
     GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); 
    } 

Моя вторая проблема: я пытаюсь написать л.д. пространство положение каждого фрагмента в рендер в текстуру, но из приведенных выше изображений можно видеть, он не работает, ниже шейдеры вершин и Фрагментным я использую для этого прохода:

//vertex shader 
#version 140 

in vec3 position; 

out vec4 worldSpacePosition; 

uniform mat4 projMatrix; //projection matrix 
uniform mat4 viewMatrix; //camera view matrix 
uniform mat4 modelMatrix; //transformation (model) matrix 

void main(void) 
{ 
    vec4 worldPos = modelMatrix * vec4(position, 1.0); 
    vec4 pos = projMatrix * viewMatrix * modelMatrix * vec4(position, 1.0); 

    gl_Position = pos; 
    worldSpacePosition = worldPos; 
} 

//fragment shader 
#version 140 

in vec4 worldSpacePosition; 

out vec4 out_colour; 

void main(void) 
{ 
    out_colour = worldSpacePosition; 
} 

Конечной цель является выборка определенного пикселя текстуры FBO (с использованием glReadPixels) для извлечения своего положения в мире. Я попытался достичь этого с помощью GL11.glReadPixels(x, y, 1, 1, GL30.GL_RGB32F, GL11.GL_FLOAT, fb);, который производит значения xyz/rgb 0,0,0 независимо от того, какой пиксель отбирается, а также GL11.glReadPixels(x, y, 1, 1, GL11.GL_RGB, GL11.GL_FLOAT, fb);, который обеспечивает значения xyz/rgb между 0 и 1, что лучше, чем 0, но все же желаемый результат.

Я также обнаружил, что он не выполняет глубинный тест при визуализации через этот проход FBO, поэтому я попытаюсь выяснить, почему.

Если кто-то может иметь какие-либо предложения, почему моя FBO текстура ореолы и как хранить позицию А фрагмента в RgB канал текстуры FBO правильно, я был бы признателен, если бы Вы, пожалуйста, помогите :)

Ура!

ответ

1

О выпуске 1 (очистка): Вы связываете фреймбуфер перед вызовом glClear? Операция очистки всегда выполняется в текущем связанном фреймбуфере (или с буфером, когда FBO не привязано).

О Иссе 2: Ваша текстура имеет формат GL_RGBA, который является 8bit нормализуется формат, который только позволяет хранить значения от 0 до 1. Кроме того, ваш внутренний формат (GL_RGB) не соответствует выбранному формату (GL_RGBA) , Либо вы хотите четыре канала, либо три, но они должны быть совместимы.

Если вы хотите сохранить позицию в мировом пространстве, которая, скорее всего, не только между 0 и 1, вам придется использовать текстуру с плавающей точкой (и больше бит на канал). GL_RGB32F или GL_RGBA32F может быть то, что вы ищете.

+0

Спасибо, я вспомнил об этом после того, как FBO привязан! я определенно запомню это. , как для использования GL_RGB32F, я установить внутренний формат GL_RGB32F и формат GL_RGB32F и полученный воспроизводимое изображение полностью черный 'GL11.glTexImage2D (GL11.GL_TEXTURE_2D, 0, GL30.GL_RGB32F, ширина, высота, 0, GL30 .GL_RGB32F, GL11.GL_FLOAT, (FloatBuffer) (null)); ' – whatsthisnow

+0

Пожалуйста, ознакомьтесь с документацией! Только внутренний формат может быть размером, формат должен быть «GL_RGB». Вывод космической позиции в мире как цвет имеет некоторые проблемы. Например, отрицательное положение будет черным. Все, что больше 1, будет насыщенным. Не зная вашу сцену и значения, которые вы пишете текстуре, черный может быть правильным или нет. – BDL

+0

Я пытаюсь прочитать мировое пространство заданного пикселя с использованием glReadPixels из вышеупомянутой текстуры, но, несмотря на сохранение текстуры как GLRGB32F, результирующие значения находятся между 0 и 1, если я читаю GLRGB и всегда 0, когда я читаю GLRGB32F. Я не занимаюсь его визуальным представлением, я использовал его только для визуальных причин отладки. Я часами читаю документацию, но понимание с помощью документации по чтению - это не мой сильный костюм, я участвую в демонстрации. – whatsthisnow