Sorduğunuz şey OpenGL 3.2'de mümkündür. FBO'mun dağınık rengi bir renk dokusuna, normalleri başka bir renk dokusuna ve derinliği bir derinlik dokusuna tükürdüm - renderbuffer'a gerek yok. Aslında renderbuffers sadece bir sorundur, çünkü onlardan örnekleme yapamazsınız, bu nedenle glReadPixels(...)
sadece GPU belleğindeki her şeyi korumak yerine verileri RBO'dan ve CPU üzerindeki bir dokuya kullanmanız veya bir şekilde kopyalamanız gerekir. Yani...
Gerçekten istiyorsanız, FBO'nuzdaki ayrı bir renk dokusu ekine manuel olarak derinlik gibi şeyler çıktısı almak için ilk geçiş gölgelendiricinize kod yazabilirsiniz. Yani tarafından kullanılmak üzere olurdu size Sonradan geçiren shader içinde. İçin OpenGL'ın iç derinlik-testinde kullanılmak, fazladan ya da fbo en GL_DEPTH_ATTACHMENT gibi bir RBO veya doku seti gerekir. Ancak her ikisine de hizmet etmek için tek bir doku ayarlayabilirsiniz - bu daha verimli ve kullanımı daha kolaydır.
Derinlik dokusu kurulum kodum şöyle görünüyor (Java, ByteBuffer öğelerini görmezden gel ...
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);
Ve sonra:
glBindFrameBuffer(GL_DRAW_FRAMEBUFFER, fbo.id);
//your existing glFramebufferTexture2D(...) calls here
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gBufferDepthTexture.id, 0);
Artık gBufferDepthTexture
ikinci, üçüncü geçiş parçalı gölgelendiricilerinize üniforma olarak geçebilirsiniz (veya neye sahip olduğunuzu). Şablon arabelleği ile tam olarak aynı şeyi yapabileceğinizi güvenli bir şekilde varsayabiliriz.