Не могу отрендерить объект Frame Buffer

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

glEnable( GL_TEXTURE );
glEnable( GL_TEXTURE_2D );

float *data = new float[ 756 * 756 * 3 ];

for( int i = 0 ; i < 756 ; i++ )
for( int j = 0 ; j < 756 ; j++ )
if( i == j )
for( int k = 0; k < 3 ; k++ )
data[i * 756 * 3 + j * 3 + k] = 0.0f;
else
for( int k = 0; k < 3 ; k++ )
data[ i * 756 * 3 + j * 3 + k ] = 1.0f;

GLuint Texture;
GLuint FrameBufferObject;

glGenTextures( 1 , &Texture );
glBindTexture( GL_TEXTURE_2D , Texture );
glTexImage2D( GL_TEXTURE_2D , 0 , 3 , 756 , 756 , 0 , GL_RGB , GL_FLOAT , data );

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glBindTexture( GL_TEXTURE_2D , 0 );

glewInit();

glGenFramebuffers( 1 , &FrameBufferObject );
glBindFramebuffer( GL_DRAW_FRAMEBUFFER , FrameBufferObject );
glBindTexture( GL_TEXTURE_2D , Texture );

glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, Texture, 0);

//GLuint atchements[] = { GL_COLOR_ATTACHMENT0 };
//glDrawBuffers( 1 , atchements );

GLenum e = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
if (e != GL_FRAMEBUFFER_COMPLETE)
cout << " MASIVE ERROR, ABORT ! " << endl;

glBindFramebuffer( GL_DRAW_FRAMEBUFFER , 0 );

/* program main loop */
while (!bQuit)
{
/* check for messages */
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
/* handle or dispatch messages */
if (msg.message == WM_QUIT)
{
bQuit = TRUE;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
/* OpenGL animation code goes here */

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);

glLoadIdentity();

glPushMatrix();
glRotatef(theta, 0.0f, 0.0f, 1.0f);

glBindTexture( GL_TEXTURE_2D , 0 );

glBindFramebuffer( GL_DRAW_BUFFER , FrameBufferObject );

//GLuint atchements[] = { GL_COLOR_ATTACHMENT0 };
//glDrawBuffers( 1 , atchements );

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);

glBindTexture( GL_TEXTURE_2D , 0 );
glBegin(GL_QUADS);
glColor3f( 1 , 0 , 1 );

glVertex2f( 0 , 0 );
glVertex2f( 0 , .1 );
glVertex2f( .1 , .1 );
glVertex2f( .1 , 0 );

glColor3f( 1 , 1 , 1 );
glEnd();

glBindFramebuffer( GL_DRAW_BUFFER , 0 );

glScalef( 0.5 , .5 , .5 );
glTranslatef( 0 , 0.3 , 0 );

glBindTexture( GL_TEXTURE_2D , Texture );
glBegin(GL_QUADS);

glTexCoord2f( 0 , 0 );
glVertex2f( 0 , 0 );

glTexCoord2f( 0 , 1 );
glVertex2f( 0 , 1 );

glTexCoord2f( 1 , 1 );
glVertex2f( 1 , 1 );

glTexCoord2f( 1 , 0 );
glVertex2f( 1 , 0 );

glEnd();

glPopMatrix();

SwapBuffers(hDC);

theta += 1.0f;
Sleep (1);
}
}

1

Решение

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

Что вы сейчас делаете в основном цикле:

  1. установить FBO как кадровый буфер рисования, поэтому рендеринг Texture
  2. очистить это
  3. нарисовать какой-нибудь квад с пурпурным цветом, текстурирование по-прежнему включено, но объект текстуры 0 привязан
  4. по-прежнему оставить FBO привязанным, как рисовать кадровый буфер
  5. вы также связываете FBO как read framebuffer, который здесь бесполезен
  6. визуализировать белый квадрат с текстурой, которую вы визуализировали в 2&3

Шаг 4&6 в комбинации создать недействительным Обратная связь, так как вы все еще оказываете в Texture с этой точки зрения. Вы никогда не рендеритесь на экран, поэтому вы вообще ничего не должны видеть. Тот факт, что вы действительно видите что-то, кроме черного экрана, означает, что я упустил какую-то другую ошибку, потому что вы не должны этого делать. (РЕДАКТИРОВАТЬ: ОП заметил, что он изначально написал glBindFramebuffer(GL_DRAW_BUFFER,...) вместо GL_DRAW_FRAMEBUFFER, что теперь полностью объясняет наблюдаемое поведение.)

Вы, вероятно, хотите glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0) вместо шага 4&5, для рендеринга в кадровый буфер по умолчанию снова.

Некоторые другие вопросы:

  • Вы никогда не регулируете размер области просмотра в соответствии с размером используемого вами кадрового буфера
  • Вы снова прикрепляете текстуру к FBO
  • Вы используете массив с плавающей точкой, чтобы указать исходную текстуру, хотя ваш внутренний формат — просто 8-битный нормализованный формат uint на канал
0

Другие решения


По вопросам рекламы [email protected]