Использование glBindFramebuffer в openGL, похоже, не имеет никакого эффекта - PullRequest
1 голос
/ 19 февраля 2012

Я вхожу в FBO (Framebuffer Objects) в openGL.Прямо сейчас я просто пытаюсь что-то отрисовать в FBO, а затем использую связанную с ним текстуру для рендеринга этого изображения на экран.Я работал над этой проблемой часами сегодня и вчера.Я пробовал копировать как можно точнее два разных примера, и все же у меня все та же проблема.Я абсолютно застрял.

Кажется, что происходит то, что объект кадрового буфера фактически не связывается.В коде у меня есть два набора команд glClear () и glClearColor (): первая для рисования в буфер кадров, а вторая для рисования на экран.Однако, когда я закомментирую второй набор, первый набор явно влияет на экран.Если FBO привязано, не должно ли оно получать эти команды, и не напрямую влияет на фактический вывод на экран?

Для начала я использую glewInit (), а затем создаюFBO, а затем объект Renderbuffer и текстуру, связанную с ним, и выполните все необходимые шаги, чтобы собрать все это вместе:

glewInit();

int width=512,height=512;

glGenFramebuffers(1, &fbo);
glGenRenderbuffers(1, &rbo);
glGenTextures(1, &fboTex);

glBindFramebuffer(GL_FRAMEBUFFER, fbo);

glBindTexture(GL_TEXTURE_2D, fboTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_INT, NULL);

glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTex, 0);

glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
assert(status==GL_FRAMEBUFFER_COMPLETE);

glBindTexture(GL_TEXTURE_2D,0);
glBindFramebuffer(GL_FRAMEBUFFER,fbo);

Затем я рисую объект framebuffer.

glClearColor(0.5,0.5,0.5,1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glColor4f(1.0,0,0,1);
glBegin(GL_QUADS);
glVertex2f(100,100);
glVertex2f(200,100);
glVertex2f(200,250);
glVertex2f(100,200);
glEnd();

Затем я связываю каждый из следующих трех объектов:

glBindFramebuffer(GL_FRAMEBUFFER,0);
glBindRenderbuffer(GL_RENDERBUFFER,0);
glBindTexture(GL_TEXTURE_2D,0);

Затем я пытаюсь нарисовать текстуру в окне:

glEnable(GL_TEXTURE_2D);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTextureEXT(GL_TEXTURE_2D, fboTex);
glBegin(GL_QUADS);
glTexCoord2f(0,0);glVertex3f(-.5,-.5,0);
glTexCoord2f(1,0);glVertex3f(.5,-.5,0);
glTexCoord2f(1,1);glVertex3f(.5,.5,0);
glTexCoord2f(0,1);glVertex3f(-.5,.5,0);
glEnd();
glDisable(GL_TEXTURE_2D);
glFlush();

Это должно бытьили какая-то действительно простая ошибка или недоразумение, которое каким-то образом избежало уничтожения, когда я заново набрал все эти дважды , или проблема с драйверами?Предполагается, что мой драйвер может работать с версией 3.2 openGL ...

Любая помощь по этому разочаровывающему вопросу была бы великолепной.

РЕДАКТИРОВАТЬ: я узнал, что я в конечном итоге делал неправильно.Я не осознавал, что команды glColor влияют на любой выполненный рисунок, независимо от того, есть ли у вас в данный момент рамочный буфер или нет.Мне нужно было поменять glColor back на (1,1,1) после рисования в FBO, чтобы позже визуализировать текстуру FBO со всем ее цветом.

1 Ответ

1 голос
/ 19 февраля 2012

Без полного примера кода трудно понять, что не так.Для начала вашей работы в FBO я предоставляю https://github.com/datenwolf/codesamples/tree/master/samples/OpenGL/minimalfbo

...