2015-06-22 6 views
5

मैं फ़्रेमबफर बनाने के लिए 2 बनावट (मल्टी रेंडर लक्ष्य) के साथ बनाने का प्रयास करता हूं। फिर हर बार कदम में, दोनों कोडों को निम्नलिखित कोड के रूप में साफ़ और चित्रित किया जाता है। (कुछ हिस्सा यह कम करने के लिए छद्म कोड के रूप में बदल दिया जाएगा।)ओपनगल - क्या एक एफबीओ में संग्रहीत glDrawBuffers संशोधन है? नहीं?

संस्करण 1

//beginning of the 1st time step 
initialize(framebufferID12) 
//^ I quite sure it is done correctly, 
//^ Note : there is no glDrawBuffers() calling 

loop , do once every time step { 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID12); 
    //(#1#) a line will be add here in version 2 (see belowed) <------------ 
    glClearColor (0.5f, 0.0f, 0.5f, 0.0f); 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    // paint a lot of object here , using glsl (Shader .frag, .vert) 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 
} 

सभी वस्तुओं दोनों बनावट के लिए सही ढंग से चित्रित किया जाता है, लेकिन केवल पहले बनावट (ATTACHMENT0) है हर फ्रेम को मंजूरी दे दी, जो गलत है।

संस्करण 2

मैं कोड की एक पंक्ति को सम्मिलित करने के लिए प्रयास करें ...

glDrawBuffers({ATTACHMENT0,ATTACHMENT1}) ; 
पर (# 1 #)

और यह उम्मीद अर्थात स्पष्ट सभी दो संरचनाओं के रूप में काम करता है।

(छवि http://s13.postimg.org/66k9lr5av/gl_Draw_Buffer.jpg)

संस्करण 3

संस्करण 2 से, मैं इस

initialize(int framebufferID12){ 
    int nameFBO = glGenFramebuffersEXT(); 
    int nameTexture0=glGenTextures(); 
    int nameTexture1=glGenTextures(); 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,nameFBO); 
     glBindTexture(nameTexture0); 
     glTexImage2D(....); glTexParameteri(...); 
     glFramebufferTexture2DEXT(ATTACHMENT0, nameTexture0); 
     glBindTexture(nameTexture1); 
     glTexImage2D(....); glTexParameteri(...); 
     glFramebufferTexture2DEXT(ATTACHMENT0, nameTexture1); 
     glDrawBuffers({ATTACHMENT0,ATTACHMENT1}) ; //<--- moved here --- 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0); 
    return nameFBO ; 
} 

की तरह फ्रेम बफर आरंभीकरण के अंदर होने की कि glDrawBuffers() बयान के लिए कदम यह अब काम नहीं कर रहा है (संस्करण 1 की तरह लक्षण), क्यों?

ओपन मैनुअल ने कहा कि "संदर्भ राज्य में परिवर्तन इस वस्तु में संग्रहीत किया जाएगा", इसलिए glDrawBuffers() "framebufferID12" में संग्रहीत किया जाएगा से राज्य संशोधन है ना? फिर, मुझे इसे हर बार चरण (या हर बार जब मैं एफबीओ बदलता हूं)

मैं कुछ ओपनजीएल की अवधारणा को गलत समझ सकता हूं, तो कृपया मुझे ज्ञान दें।

संपादित करें 1: धन्यवाद जे-पी। मैं मानता हूं कि यह समझ में आता है, लेकिन क्या राज्य पहले ही एफबीओ में दर्ज नहीं किया जाना चाहिए?

संपादित करें 2 (उत्तर स्वीकार करें): रेटो कोराडी का जवाब सही है! मैं एलडब्ल्यूजेजीएल नामक एक गैर-मानक पुस्तकालय का उपयोग कर रहा हूं।

+0

यह मेरे लिए समझ में आता है कि यदि आप डिफ़ॉल्ट कॉन्फ़िगरेशन का उपयोग नहीं करते हैं तो आपको प्रत्येक बार जब आप एक नए बफर से बांधते हैं तो ड्रा बफर समायोजित करना होता है। लेकिन मैं विशेषज्ञ नहीं हूँ ... –

उत्तर

4

हां, ड्रॉ बफर सेटिंग फ्रेमबफर स्थिति का हिस्सा है। यदि आप उदाहरण के लिए ओपनजीएल 3.3 स्पेक दस्तावेज़ देखते हैं, तो यह पृष्ठ 2 9 2 पर तालिका 6.23 में सूचीबद्ध है, जिसका नाम "फ्रेमबफर (राज्य प्रति फ्रेमबफर ऑब्जेक्ट)" है।

एफबीओ के लिए डिफ़ॉल्ट मान एक एकल ड्रा बफर है, जो GL_COLOR_ATTACHMENT0 है। उसी spec से, पृष्ठ 214:

फ्रेमबफर ऑब्जेक्ट्स के लिए, प्रारंभिक स्थिति में, खंड रंग शून्य के लिए ड्रा बफर COLOR_ATTACHMENT0 है। डिफ़ॉल्ट फ्रेमबफर और फ्रेमबफर ऑब्जेक्ट्स दोनों के लिए, खंड रंगों के लिए ड्रा बफर की प्रारंभिक स्थिति अन्य शून्य नहीं है।

तो यह उम्मीद की जाती है कि यदि आपके पास एक से अधिक ड्रा बफर हैं, तो आपको स्पष्ट glDrawBuffers() कॉल की आवश्यकता है।

अब, यदि आप glDrawBuffers() एफबीओ सेटअप के हिस्से के रूप में कॉल करते हैं, तो यह आपके लिए काम क्यों नहीं प्रतीत होता है, यह कुछ हद तक रहस्यमय है। एक कोड जो मैं आपके कोड में देखता हूं वह यह है कि आप एफबीओ कॉल के EXT फॉर्म का उपयोग कर रहे हैं। मुझे संदेह है कि इससे आपकी समस्या के साथ कुछ करना पड़ सकता है।

एफबीओ संस्करण 3.0 के बाद से मानक ओपनजीएल का हिस्सा रहा है। यदि आपके पास ओपनजीएल 3.0 या बाद में उपयोग करने का कोई तरीका है, तो मैं दृढ़ता से अनुशंसा करता हूं कि आप मानक प्रविष्टि बिंदुओं का उपयोग करें। कार्यक्षमता मानक बनने के बाद भी सामान्य रूप से एक्सटेंशन अभी भी काम करते हैं, लेकिन मैं हमेशा संदेह करता हूं कि वे अन्य सुविधाओं के साथ कैसे बातचीत करते हैं। विशेष रूप से, विभिन्न व्यवहार के साथ 3.0 से पहले एफबीओ कार्यक्षमता के लिए कई एक्सटेंशन थे। मैं आश्चर्यचकित नहीं होगा अगर उनमें से कुछ मानक एफबीओ कार्यक्षमता की तुलना में अन्य ओपनजीएल कॉल के साथ अलग-अलग बातचीत करते हैं।

तो, मानक प्रविष्टि बिंदुओं का उपयोग करने का प्रयास करें (EXT उनके नाम पर बिना)। उम्मीद है कि आपकी समस्या हल हो जाएगी।

संबंधित मुद्दे