Quello che stai chiedendo è possibile in OpenGL 3.2. Ho il mio FBO che distribuisce il colore diffuso a una trama a colori, le normali a un'altra trama a colori e la profondità a una trama a profondità, senza bisogno di renderbuffer. In effetti i renderbuffer sono solo un problema, perché non puoi campionarli, quindi dovresti usare glReadPixels(...)
o in qualche modo copiare i dati dall'RBO e in una trama sulla CPU, invece di mantenere tutto nella memoria GPU. Così...
Se vuoi davvero, puoi scrivere il codice nel tuo shader di primo passaggio per produrre manualmente cose come la profondità, su un allegato di trama di colore separato nel tuo FBO. Sarebbe utile per te nei tuoi shader post pass. Per l' utilizzo di OpenGL nei test di profondità interni, è inoltre necessario un RBO o un set di texture come GL_DEPTH_ATTACHMENT dell'FBO. Ma puoi impostare una singola trama per servire entrambi - questo è più efficiente e più facile da usare.
Il mio codice di configurazione della trama di profondità è simile al seguente (Java, ignoro solo le cose di ByteBuffer ... e nota che uso "id" per fare riferimento a handle / puntatori di numeri interi, dal momento che quel concetto non si adatta bene a 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);
E più tardi:
glBindFrameBuffer(GL_DRAW_FRAMEBUFFER, fbo.id);
//your existing glFramebufferTexture2D(...) calls here
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gBufferDepthTexture.id, 0);
Ora puoi passare gBufferDepthTexture
(o cosa hai) in uniforme al tuo secondo, terzo passaggio shader di frammenti. Penso che possiamo tranquillamente presumere che tu possa fare esattamente la stessa cosa con il buffer di stencil.