To, o co pytasz, jest możliwe w OpenGL 3.2. Mój FBO wypluwa rozproszony kolor na teksturę koloru, normalny na teksturę innego koloru i głębię na teksturę głębokości - nie są potrzebne bufory renderujące. W rzeczywistości renderbuffery to tylko problem, ponieważ nie można próbkować z nich, więc trzeba będzie użyć glReadPixels(...)
lub w inny sposób skopiować dane z RBO do tekstury na procesorze, zamiast po prostu utrzymywać wszystko w pamięci GPU. Więc...
Jeśli naprawdę chcesz, możesz napisać kod w shaderze pierwszego przejścia, aby ręcznie wyprowadzać takie rzeczy, jak głębia, do osobnego załącznika tekstury koloru w FBO. Będzie to do wykorzystania przez ciebie w shaderach po przejściu. Do użytku OpenGL w wewnętrznych testach głębokości dodatkowo potrzebujesz zestawu RBO lub zestawu tekstur jako GL_DEPTH_ATTACHMENT twojego FBO. Ale możesz ustawić jedną teksturę, która będzie obsługiwała obie - jest to bardziej wydajne i łatwiejsze w użyciu.
Mój kod konfiguracji tekstury głębi wygląda tak (Java, po prostu zignoruj rzeczy ByteBuffer ... i zwróć uwagę, że używam „id” w odniesieniu do uchwytów / wskaźników liczb całkowitych, ponieważ ta koncepcja nie jest zbyt dobra w Javie):
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);
I później:
glBindFrameBuffer(GL_DRAW_FRAMEBUFFER, fbo.id);
//your existing glFramebufferTexture2D(...) calls here
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gBufferDepthTexture.id, 0);
Możesz teraz przekazać gBufferDepthTexture
(lub co masz) mundur do swoich shaderów fragmentów drugiego, trzeciego przejścia. Myślę, że możemy bezpiecznie założyć, że możesz zrobić dokładnie to samo z buforem wzornika.