आप जो पूछ रहे हैं वह OpenGL 3.2 में संभव है। मैं अपने FBO बाहर रंग फैलाने के लिए एक रंग बनावट, एक और रंग बनावट के लिए मानदंडों और एक गहराई बनावट के लिए गहराई से मिल गया है - कोई ज़रूरत नहीं सौंपनेवाला। वास्तव में रेंडरबफर्स केवल एक समस्या है, क्योंकि आप उनसे नमूना नहीं ले सकते हैं, इसलिए आपको glReadPixels(...)
केवल जीपीयू मेमोरी में सब कुछ बनाए रखने के बजाय, आरबीओ से बाहर डेटा का उपयोग करना होगा या सीपीयू पर बनावट में कॉपी करना होगा। इसलिए...
यदि आप वास्तव में चाहते हैं, तो आप अपने पहले पास-पास के शेडर में कोड को गहराई से आउटपुट सामग्री के रूप में लिख सकते हैं, अपने FBO में एक अलग रंग बनावट अनुलग्नक के लिए। यही कारण है कि द्वारा उपयोग के लिए होगा आप अपनी पोस्ट-पास shaders में। के लिए ओपन के अपने आंतरिक गहराई परीक्षण में उपयोग करते हैं, आप अतिरिक्त या तो एक RBO या अपने FBO के GL_DEPTH_ATTACHMENT के रूप में बनावट सेट की आवश्यकता होगी। लेकिन आप दोनों की सेवा करने के लिए एक एकल बनावट सेट कर सकते हैं - यह अधिक कुशल और उपयोग करने में आसान है।
मेरी गहराई बनावट सेटअप कोड इस तरह दिखता है (जावा, बस बाइटबफ़र सामान को अनदेखा करें ... और ध्यान दें कि मैं पूर्णांक हैंडल / पॉइंटर्स को संदर्भित करने के लिए "आईडी" का उपयोग करता हूं, क्योंकि यह अवधारणा वास्तव में जावा में अच्छी तरह से नहीं बैठती है):
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
आप अपने दूसरे, तीसरे पास के टुकड़े के लिए वर्दी के रूप में (या आपके पास क्या है) पास कर सकते हैं । मुझे लगता है कि हम सुरक्षित रूप से मान सकते हैं कि आप स्टैंसिल बफर के साथ एक ही काम कर सकते हैं।