2011-08-02 14 views
6

मैं उलझन में हूं। विंडोज, जो इनमें से मैं प्रयोग करते हैं ?:glgenFramebuffers या glGenFramebuffersEXT?

wglGetProcAddress("glGenFramebuffers"); 
// or 
wglGetProcAddress("glGenFramebuffersEXT"); 

जहां तक ​​मेरा अलग हार्डवेयर के साथ उपयोगकर्ताओं की रिपोर्ट से बता सकते हैं, कुछ चालकों सभी समर्थन पर ओपन 1.x में फ्रेमबफर वस्तु विस्तार (FBO) का उपयोग करने के न तो संयोजन, दो में से एक, या दोनों।

उपयोग करने के लिए सही कौन सा है? क्या कुछ ड्राइवर वास्तव में एक का समर्थन करते हैं लेकिन दूसरे नहीं? यदि नहीं मिला तो क्या एक से दूसरे में वापस गिरने की कोशिश करना सही है?


संपादित करें: मैं अभी भी ATI Radeon कार्ड के साथ गंभीर समस्याओं और इस के आसपास कोड हो रही है। हमने अभी इस कोड (www.scirra.com) का उपयोग करके एक वाणिज्यिक संपादक लॉन्च किया है। ऐसा लगता है कि एफबीओ का उपयोग करने के लिए मैं जिस कोड का उपयोग करता हूं, इससे कोई फर्क नहीं पड़ता, उपयोगकर्ताओं की रिपोर्ट के कुछ अलग संयोजन वे कुछ भी नहीं देख सकते हैं (यानी कुछ भी प्रस्तुत नहीं करता है)।

यहां कोड है जहां मैं पता लगाता हूं कि एआरबी फ़ंक्शन (कोई प्रत्यय) या EXT-suffixed फ़ंक्शंस का उपयोग करना है या नहीं। इससे स्टार्टअप पर चलाता है:

gl_extensions = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)); 
gl_vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR)); 
gl_renderer = reinterpret_cast<const char*>(glGetString(GL_RENDERER)); 
gl_version = reinterpret_cast<const char*>(glGetString(GL_VERSION)); 
gl_shading_language = reinterpret_cast<const char*>(glGetString(GL_SHADING_LANGUAGE_VERSION)); 

// If OpenGL version >= 3, framebuffer objects are core - enable regardless of extension 
// (the flags are initialised to false) 
if (atof(gl_version) >= 3.0) 
{ 
    support_framebuffer_object = true; 
    support_framebuffer_via_ext = false; 
} 
else 
{ 
    // Detect framebuffer object support via ARB (for OpenGL version < 3) - also uses non-EXT names 
    if (strstr(gl_extensions, "ARB_framebuffer_object") != 0) 
    { 
     support_framebuffer_object = true; 
     support_framebuffer_via_ext = false; 
    } 
    // Detect framebuffer object support via EXT (for OpenGL version < 3) - uses the EXT names 
    else if (strstr(gl_extensions, "EXT_framebuffer_object") != 0) 
    { 
     support_framebuffer_object = true; 
     support_framebuffer_via_ext = true; 
    } 
} 
फिर

बाद में स्टार्टअप के दौरान यह बनावट के प्रतिपादन की प्रत्याशा में एक FBO बनाता है:

// Render-to-texture support: create a frame buffer object (FBO) 
if (support_framebuffer_object) 
{ 
    // If support is via EXT (OpenGL version < 3), add the EXT suffix; otherwise functions are core (OpenGL version >= 3) 
    // or ARB without the EXT suffix, so just get the functions on their own. 
    std::string suffix = (support_framebuffer_via_ext ? "EXT" : ""); 

    glGenFramebuffers = (glGenFramebuffers_t)wglGetProcAddress((std::string("glGenFramebuffers") + suffix).c_str()); 
    glDeleteFramebuffers = (glDeleteFramebuffers_t)wglGetProcAddress((std::string("glDeleteFramebuffers") + suffix).c_str()); 
    glBindFramebuffer = (glBindFramebuffer_t)wglGetProcAddress((std::string("glBindFramebuffer") + suffix).c_str()); 
    glFramebufferTexture2D = (glFramebufferTexture2D_t)wglGetProcAddress((std::string("glFramebufferTexture2D") + suffix).c_str()); 
    glCheckFramebufferStatus = (glCheckFramebufferStatus_t)wglGetProcAddress((std::string("glCheckFramebufferStatus") + suffix).c_str()); 
    glGenerateMipmap = (glGenerateMipmap_t)wglGetProcAddress((std::string("glGenerateMipmap") + suffix).c_str()); 

    // Create a FBO in anticipation of render-to-texture 
    glGenFramebuffers(1, &fbo); 
} 

मैं इस कोड के कई रूपों के माध्यम से किया गया है, और मैं बस नहीं मिल सकता है यह हर किसी के लिए काम करने के लिए। हमेशा उपयोगकर्ताओं का एक समूह होता है जो कुछ भी प्रस्तुत नहीं करता है। अति राडेन एचडी कार्ड विशेष रूप से समस्याग्रस्त प्रतीत होते हैं। मुझे यकीन नहीं है कि कोई ड्राइवर बग शामिल है, लेकिन मुझे लगता है कि यह उपरोक्त कोड गलत धारणा बना रहा है।

500 प्रतिनिधि बक्षीस और मैं किसी को भी एक मुफ्त व्यापार लाइसेंस भेजूंगा जो जानता है कि क्या गलत है! (£ 99 के लायक)


संपादित करें 2: कुछ और विवरण।

अति गतिशीलता Radeon HD 5650

अति Radeon X1600 प्रो

अति गतिशीलता Radeon HD 4200

बनावट के लिए कोई प्रतिपादन वास्तव में है: यहाँ ताश के पत्तों की एक सूची है कि इस पर विफल जाना जाता है किया हुआ। ऐसा लगता है कि glGenFramebuffers अकेले कॉल इन कार्डों पर पूरी तरह से रेंडर करना बंद कर देता है। मैं पहली बार एफबीओ के निर्माण को रोक सकता हूं, वास्तव में प्रस्तुत करने के लिए वास्तव में किया जाता है, लेकिन फिर संभवतः यह फिर से प्रस्तुत करना बंद कर देगा।

मैं जीएलईडब्लू का उपयोग कर सकता हूं, लेकिन यह क्या करता है कि मेरा कोड नहीं है? मैंने स्रोत के माध्यम से एक नज़र डाली और ऐसा लगता है कि wglGetProcAddress की एक समान सूची का उपयोग किया जाता है। मेरे मामले में तरीके वापस आ रहे हैं, अन्यथा glGenFramebuffers शून्य और क्रैश होगा। कोई विचार...?

+0

मैं यहाँ इनाम पाने के लिए नहीं देख रहा हूँ, लेकिन आप Glew (http://stackoverflow.com/questions/17370/using-glew-to-use-opengl-extensions में रुचि हो सकती -under-विंडोज़)। इससे अब मेरे लिए कई परियोजनाओं में कई प्लेटफार्मों में एक्सटेंशन प्रबंधित करने के दर्द को कम करने में मदद मिली है और मैं इसे wglGetProcAddress मैन्युअल रूप से कॉल करने पर अत्यधिक अनुशंसा करता हूं। – Flexo

+2

यदि आपने हमें बताया कि विशेष रूप से क्या गलत हो रहा है तो यह वास्तव में सहायक होगा। आप एफबीओ का उपयोग कैसे कर रहे हैं, एटीआई कार्ड में समस्या क्या है, इत्यादि।क्या आपके पास अपने ग्राहकों से कोई रिमोट रिपोर्ट है? शायद कुछ किस प्रकार के एफबीओ समर्थित हैं, क्या फ्रेमबफर पूरा हो गया है, आदि? –

+0

क्या आपने नया निर्माण करने के बाद विंडो फ्रेम बफर को सक्रिय करने का प्रयास किया है। कुछ कार्यान्वयन * हो सकता है * तुरंत इसे स्विच करें। –

उत्तर

8

यदि एक्सटेंशन GL_EXT_framebuffer_object मौजूद है, तो आप wglGetProcAddress("glGenFramebuffersEXT"); का उपयोग कर सकते हैं।

यदि ओपनजीएल संस्करण> = 3.0 (इस संस्करण में एफबीओ एक्सटेंशन कोर में जोड़ा गया था), तो आप wglGetProcAddress("glGenFramebuffers"); का उपयोग कर सकते हैं।

+0

धन्यवाद। यदि ओपनजीएल संस्करण> = 3 है, तो 'wglGetProcAddress ("glGenFramebuffersEXT") अभी भी काम करेगा या इसे हटा दिया गया है? – AshleysBrain

+0

@AshleysBrain: मुझे लगता है कि यह ड्राइवर निर्माता पर निर्भर करता है, लेकिन मुझे इसके बारे में निश्चित नहीं है। शायद कोई और इसमें कूद सकता है :-) – Tobi

+0

ओह ठीक है मुझे लगता है कि इससे कोई फर्क नहीं पड़ता। ओपनजीएल संस्करण> = 3. धन्यवाद अगर मैं गैर-EXT संस्करण का अनुरोध करूंगा! – AshleysBrain

3

आपके द्वारा शामिल किया गया कोड समस्या नहीं है।बेशक, बाध्यकारी अंक प्राप्त किए जाएंगे जैसा कि आप पहले से ही करते हैं।

मामले में ARB_framebuffer_object समर्थित है, EXT प्रत्यय के बिना प्रविष्टि बिंदुओं का उपयोग करता है। मामले में EXT_framebuffer_object समर्थित है, EXT प्रत्यय के साथ प्रविष्टि बिंदुओं का उपयोग करता है। यदि दोनों समर्थित हैं, तो आप सही बाध्यकारी बिंदु प्राप्त करके कार्यान्वयन का चयन कर सकते हैं।

मुझे इस मुद्दे पर बहुत दिलचस्पी है (क्योंकि मेरे पास a similar doubt था क्योंकि)।

आप EXT विनिर्देशन के साथ एआरबी विनिर्देश तुलना हैं, तो आप मतभेद की एक बहुत कुछ देख सकते हैं।

यहां, मैं इस विषय पर सबसे दिलचस्प एआरबी विनिर्देश अनुच्छेद उद्धृत करूंगा।

विनिर्देश बहुत लंबा है, लेकिन एआरबी संस्करण EXT संगतता मुद्दे पर कई चर्चाओं में शामिल है। चूंकि आप एप्लिकेशन चला रहे हैं, प्रवेश बिंदु शायद सही हैं, और त्रुटि (जैसा कि निकोलस बोलास द्वारा सुझाया गया है) फ्रेमबफर पूर्णता में हो सकता है।

हर संभव जाँच का परिचय, और कार्यान्वयन दो बार दोहरी जांच (एक विकेट एआरबी मन में कल्पना, एक EXT मन में कल्पना लेने)।


क्या अतिरिक्त कार्यक्षमता इस विस्तार EXT_framebuffer_object से अधिक शामिल होते हैं?

Currently we incorporate the following layered extensions: 

    * EXT_framebuffer_multisample 
    * EXT_framebuffer_blit 
    * EXT_packed_depth_stencil 

साथ ही निम्नलिखित विशेषताएं:

 * Permit attachments with different width and height (mixed 
     dimensions) 

    * Permit color attachments with different formats (mixed 
     formats). 

    * Render to 1 and 2 component R/RG formats that are provided 
     via the ARB_texture_rg extension. L/A/LA/I will be 
     left for a separate (trivial) extension. 

    * Gen'ed names must be used for framebuffer objects and 
     renderbuffers. 

    * Added FramebufferTextureLayer. 
    ... 

क्या EXT_framebuffer_object से अन्य मतभेद हैं।

 * Framebuffer completeness only considers the attachments named 
     by DRAW_BUFFERi and READ_BUFFER. Any other attachments do 
     not affect framebuffer completeness. (In 
     EXT_framebuffer_object, all attachments affected framebuffer 
     completeness, independent of the DRAW_BUFFERi and READ_BUFFER 
     state.) 
    * Added new queries for the sizes of the bit planes for color, 
     depth and stencil attachments at a framebuffer attachment point. 
    * Added new queries for framebuffer attachment component type and 
     color encoding. 
    * Many other minor tweaks to synchronize with the GL3 framebuffer 
     objects. 
    * ARB FBOs are not shareable. 

इस विस्तार और EXT_framebuffer_object दोनों "बाँध फ्रेमबफर" कार्य (BindFramebuffer और BindFramebufferEXT)। क्या दो कार्यों के बीच कार्यक्षमता में कोई अंतर है?

RESOLVED: Yes. Both extensions will create a new framebuffer object 
    if called with an unused name. However, BindFramebuffer defined in 
    this extension will generate an INVALID_OPERATION error if the name 
    provided has not been generated by GenFramebuffer. That error did 
    not exist in EXT_framebuffer_object, and this extension does not 
    modify the behavior of BindFramebufferEXT. This difference also 
    applies to BindRenderbuffer from this extension vs. 
    BindRenderbufferEXT from EXT_framebuffer_object.