Глубинное тестирование не работает при использовании пользовательского кадрового буфера

Я изучаю фреймбуферы и сделал зеркало в моей сцене. Работает нормально, кроме тестирования глубины. Застрял, пытаясь заставить это работать. (при рендеринге в буфер кадров по умолчанию — проверка глубины работает нормально). Буду признателен за любую помощь. Вот код:

glEnable( GL_DEPTH_TEST );

glViewport( 0, 0, 512, 512 );

unsigned int fbo;
glGenFramebuffers( 1, &fbo );
glBindFramebuffer( GL_FRAMEBUFFER, fbo );

unsigned int rbo;
glGenRenderbuffers( 1, &rbo );
glBindRenderbuffer( GL_RENDERBUFFER, rbo );
glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH, 512, 512 );
glBindRenderbuffer( GL_RENDERBUFFER, 0 );

glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER, rbo ); //if remove this, mirror works but without depth test
glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
this->mirror->texturePack[0]->textureId(), 0 );

//render scene from mirror camera

glBindFramebuffer( GL_FRAMEBUFFER, 0 );
glViewport( 0, 0, this->width(), this->height() );

//render scene from main camera

1

Решение

Ваш буфер фермы неполный, потому что GL_DEPTH недопустимый внутренний формат для буфера рендеринга.
Увидеть glRenderbufferStorage. Пытаться GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24 или же GL_DEPTH_COMPONENT32:

glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 512, 512 );

Увидеть Спецификация профилей ядра OpenGL 4.6, 9.4 Полнота фреймбуфера, стр. 323:

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

• Внутренний формат рендерит по глубине, если это DEPTH_COMPONENT или один
форматов из таблицы 8.13, базовый внутренний формат которых — DEPTH_-
COMPONENT или DEPTH_STENCIL. Никакие другие форматы не являются визуализируемыми по глубине.

Обратите внимание, что полнота кадрового буфера может быть проверена:

glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE
1

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

Я наконец решил это. Я добавил команду glClear (GL_DEPTH_BUFFER_BIT) сразу после привязки зеркального кадрового буфера и после этого все заработало.

0

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