GLSL: невозможно прочитать текстуру из FBO и выполнить рендеринг в другое FBO с фрагментным шейдером - PullRequest
2 голосов
/ 10 февраля 2012

Я пытаюсь «прочитать» текстуру, прикрепленную к первому FBO (fboA), модифицирую ее (с помощью фрагментного шейдера) и выполнить рендеринг во второе FBO (fboB).

Я не могуЧтобы понять это, я получил только черную или белую текстуру.

Вот код:

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboB);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textureFromFboA);

GLuint t1Location = glGetUniformLocation(shaderProgram, "texture");
glUniform1i(t1Location, 0);

glUseProgram(shaderProgram);

glBegin(GL_QUADS);

glTexCoord2f(0.0f, 0.0f);
glVertex2f (0.0f, 0.0f);

glTexCoord2f(imageRect.size.width, 0.0f); 
glVertex2f (imageRect.size.width, 0.0f);

glTexCoord2f(imageRect.size.width, imageRect.size.height);
glVertex2f (imageRect.size.width, imageRect.size.height);

glTexCoord2f(0.0f, imageRect.size.height);
glVertex2f (0.0f,imageRect.size.height);

glEnd();
glDisable(GL_TEXTURE_RECTANGLE_ARB);
glFlush();

glUseProgram(0);

Это код фрагмента шейдера:

#version 120

uniform sampler2D texture;

void main(void)
{
    gl_FragColor = texture2D(texture, gl_TexCoord[0].st) * 0.8;
}

Я ожидаю, что в fboB будет отображаться более темная текстура, но я получаю только черную текстуру.Это также происходит, если я пишу gl_FragColor = texture2D(texture, gl_TexCoord[0].st);.

Наоборот, если я пишу gl_FragColor = vec2(1.0, 0.0, 0.0, 1.0);, у меня правильно выводится вся красная текстура.

Если я закомментирую glUseProgram()Скажите, код работает нормально, а текстура в fboB является точной копией текстуры в fboA.

Почему это происходит?Я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012
uniform sampler2D texture;

Текстуры прямоугольника не совпадают тип текстуры с 2D-текстурами.Да, они двумерные, но они по-прежнему поддерживают различный тип текстуры.Поэтому к ним нельзя получить доступ через sampler2D.

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

В качестве альтернативы, вы можете просто использовать 2D-текстуру.Текстуры NPOT существуют уже более полувека;вам не нужно использовать прямоугольные текстуры, чтобы иметь цели рендеринга не степени двух.

2 голосов
/ 10 февраля 2012

Вы не можете использовать sampler2D для текстурных прямоугольников ... вы должны использовать GL_TEXTURE_2D, а не GL_TEXTURE_RECTANGLE_ARB.

здесь у вас есть хороший учебник по FBO: http://www.songho.ca/opengl/gl_fbo.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...