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