Я работаю над объектом буфера кадров в lwjgl, чтобы сохранить единую текстуру. У меня есть 2 вопроса в настоящее время, первый вопрос является то, что текстура в буфере кадра не кажется, очищая перед визуализацией следующего кадра, как показано ниже (это ореолы правильный термин?):LWJGL - Текстуры буфера кадра
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 правильно, я был бы признателен, если бы Вы, пожалуйста, помогите :)
Ура!
Спасибо, я вспомнил об этом после того, как 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
Пожалуйста, ознакомьтесь с документацией! Только внутренний формат может быть размером, формат должен быть «GL_RGB». Вывод космической позиции в мире как цвет имеет некоторые проблемы. Например, отрицательное положение будет черным. Все, что больше 1, будет насыщенным. Не зная вашу сцену и значения, которые вы пишете текстуре, черный может быть правильным или нет. – BDL
Я пытаюсь прочитать мировое пространство заданного пикселя с использованием glReadPixels из вышеупомянутой текстуры, но, несмотря на сохранение текстуры как GLRGB32F, результирующие значения находятся между 0 и 1, если я читаю GLRGB и всегда 0, когда я читаю GLRGB32F. Я не занимаюсь его визуальным представлением, я использовал его только для визуальных причин отладки. Я часами читаю документацию, но понимание с помощью документации по чтению - это не мой сильный костюм, я участвую в демонстрации. – whatsthisnow