Те, що ви запитуєте, можливо у OpenGL 3.2. У мене FBO виплюнув розсіяний колір на кольорову текстуру, нормальний на іншу кольорову текстуру і глибину на глибину текстури - не потрібні візуалізатори. Насправді рендербуфери - це лише проблема, тому що ви не можете зробити вибірку з них, тому вам доведеться використовувати glReadPixels(...)
або іншим чином якось скопіювати дані з RBO та передати текстуру на процесор, а не просто підтримувати все в пам'яті GPU. Так...
Якщо ви дійсно хочете, ви можете написати код у вашому шейдері першого проходу, щоб вручну виводити такі речі, як глибина, до окремої вкладки кольорової текстури у вашому FBO. Це було б для використання вами у ваших шейдерах після проходу. Для використання OpenGL у його внутрішньому глибинному тестуванні вам додатково знадобиться або RBO, або набір текстур як GL_DEPTH_ATTACHMENT вашого FBO. Але ви можете налаштувати одну текстуру для обслуговування обох - це більш ефективно та простіше у використанні.
Мій код настройки текстури глибини виглядає приблизно так (Java, просто ігноруйте речі ByteBuffer ... і зауважте, що я використовую "id" для позначення цілих ручок / покажчиків, оскільки ця концепція не дуже добре відповідає Java):
gBufferDepthTexture = new Texture();
gBufferDepthTexture.id = glGenTextures();
gBufferDepthTexture.unit = 2;
gBufferDepthTexture.width = Display.getWidth();
gBufferDepthTexture.height = Display.getHeight();
gBufferDepthTexture.bytes = ByteBuffer.allocateDirect(Display.getWidth()*Display.getHeight() * 4);
glActiveTexture(gBufferDepthTexture.unit + GL_TEXTURE0); //eg. 0 + 33984 = GL_TEXTURE0, while 31 + 33984 = GL_TEXTURE31.
glBindTexture(GL_TEXTURE_2D, gBufferDepthTexture.id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, gBufferDepthTexture.width, gBufferDepthTexture.height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, gBufferDepthTexture.bytes);
//...GL_UNSIGNED_INT or GL_UNSIGNED_BYTE may work better for you, instead... YMMV.
//glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
І пізніше:
glBindFrameBuffer(GL_DRAW_FRAMEBUFFER, fbo.id);
//your existing glFramebufferTexture2D(...) calls here
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gBufferDepthTexture.id, 0);
Тепер ви можете передати gBufferDepthTexture
(або що у вас є) уніформу вашим другим, третім прохідним шейдерам. Я думаю, ми можемо сміливо припустити, що ви можете зробити те саме, що і з буфером трафарету.