2008-08-18 16 views

उत्तर

19

आसान समाधान: GLEW का उपयोग करें। देखें कि here

हार्ड समाधान: आप एक बहुत मजबूत कारण Glew उपयोग करने के लिए नहीं है, तो यहां यह कैसे बिना एक ही प्राप्त करने के लिए है:

ओपन विस्तार और एक्सटेंशन API आप उपयोग करना चाहते पहचानें। ओपनजीएल एक्सटेंशन OpenGL Extension Registry में सूचीबद्ध हैं।

उदाहरण: मैं EXT_framebuffer_object एक्सटेंशन की क्षमताओं का उपयोग करना चाहता हूं। एपीआई मैं इस विस्तार से उपयोग करना चाहते हैं कर रहे हैं: अपने ग्राफिक कार्ड विस्तार आप उपयोग करना चाहते का समर्थन करता है

glGenFramebuffersEXT() 
glBindFramebufferEXT() 
glFramebufferTexture2DEXT() 
glCheckFramebufferStatusEXT() 
glDeleteFramebuffersEXT() 

जांच करें कि। अगर ऐसा होता है, तो आपका काम लगभग पूरा हो गया है! अपने ग्राफिक्स कार्ड के लिए नवीनतम ड्राइवर और एसडीके डाउनलोड और इंस्टॉल करें।

उदाहरण: मेरा पीसी में ग्राफिक्स कार्ड एक NVIDIA 6600 जी.टी. है। इसलिए, मैं NVIDIA OpenGL Extension Specifications वेबपृष्ठ पर जाता हूं और पाते हैं कि EXT_framebuffer_object एक्सटेंशन समर्थित है। मैं फिर नवीनतम NVIDIA OpenGL SDK डाउनलोड करता हूं और इसे इंस्टॉल करता हूं।

आपका ग्राफिक कार्ड निर्माता सभी समर्थित ओपन एक्सटेंशन का उपयोग करने के लिए आवश्यक घोषणाओं के साथ एक glext.h हेडर फाइल (या एक समान नाम वाले हेडर फाइल) प्रदान करता है। (ध्यान दें कि सभी एक्सटेंशन समर्थित नहीं हो सकते हैं।) या तो इस हेडर फ़ाइल को कहीं भी रखें जहां आपका कंपाइलर इसे उठा सकता है या आपके कंपाइलर की निर्देशिका सूची में इसकी निर्देशिका शामिल कर सकता है।

अपने कोड में हेडर फ़ाइल को शामिल करने के लिए अपने कोड में #include <glext.h> लाइन जोड़ें।

ओपन glext.h आप API का उपयोग करें और हड़पने के लिए चाहते हैं उन्हें ढूंढ़ने अपनी इसी बदसूरत दिखने घोषणा।

उदाहरण: मैं ऊपर फ्रेमबफर एपीआई के लिए खोज और उनके इसी बदसूरत दिखने घोषणाओं पाते हैं:

typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); for GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei, GLuint *); 

इस सब का मतलब है कि आपके हेडर फाइल 2 रूपों में एपीआई घोषणा की है। एक एक wgl- जैसे बदसूरत समारोह सूचक घोषणा है। दूसरा एक साधु दिखने की घोषणा घोषणा है।

प्रत्येक एक्सटेंशन एपीआई के लिए आप उपयोग करना चाहते हैं, फ़ंक्शन नाम की अपनी कोड घोषणाओं को बदसूरत दिखने वाली स्ट्रिंग के प्रकार के रूप में जोड़ें।

उदाहरण:

PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT; 
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT; 
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT; 
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT; 
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT; 

हालांकि यह बदसूरत लग रहा है, हम सभी कर रहे हैं प्रकार एक्सटेंशन API करने के लिए इसी के समारोह संकेत घोषित करने के लिए है।

इन फ़ंक्शन पॉइंटर्स को उनके सही कार्यों के साथ आरंभ करें। ये कार्य पुस्तकालय या ड्राइवर द्वारा उजागर किए जाते हैं। हमें ऐसा करने के लिए wglGetProcAddress() फ़ंक्शन का उपयोग करने की आवश्यकता है।

उदाहरण:

glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT"); 
glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT"); 
glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT"); 
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT"); 
glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) wglGetProcAddress("glDeleteFramebuffersEXT"); 

भूल शून्य के लिए समारोह संकेत जाँच करने के लिए न करें। यदि मौके से wglGetProcAddress() एक्सटेंशन फ़ंक्शन नहीं मिला, तो यह पॉइंटर को न्यूल के साथ प्रारंभ कर देता।

उदाहरण:

if (NULL == glGenFramebuffersEXT || NULL == glBindFramebufferEXT || NULL == glFramebufferTexture2DEXT 
    || NULL == glCheckFramebufferStatusEXT || NULL == glDeleteFramebuffersEXT) 
{ 
    // Extension functions not loaded! 
    exit(1); 
} 

यह है कि, हम काम हो गया! अब आप इन फ़ंक्शन पॉइंटर्स का उपयोग कर सकते हैं जैसे फ़ंक्शन कॉल मौजूद हैं।

उदाहरण:

glGenFramebuffersEXT(1, &fbo); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, colorTex[0], 0); 

संदर्भ:Moving Beyond OpenGL 1.1 for Windows डेव एस्टल द्वारा - लेख थोड़ा दिनांकित है, लेकिन सभी जानकारी को समझने के लिए क्यों इस दयनीय स्थिति Windows और पर मौजूद है की जरूरत है इसके आसपास कैसे जाना है।

+0

मैं ओपनजीएल को GLEW के साथ काम करने के लिए पूरे दिन खर्च कर रहा हूं लेकिन मैं समस्याओं में भाग रहा हूं ... बस आपको पता है: ओपनजीएल सेट अप करना इतना आसान नहीं है। लेकिन जब यह चल रहा है: पी –

0

@ क्रोनिकारज़: इसकी प्रतीत से, GLEW भविष्य का मार्ग प्रतीत होता है। एनवीआईडीआईए पहले से ही इसे OpenGL SDK के साथ भेजता है। और इसकी नवीनतम रिलीज 2007 में जीएलईई की तुलना में 2007 में थी।

लेकिन, दोनों पुस्तकालयों का उपयोग लगभग मेरे जैसा ही दिखता है। (GLEW में init() है जिसे किसी और चीज़ से पहले बुलाया जाना चाहिए।) इसलिए, आपको तब तक स्विच करने की आवश्यकता नहीं है जब तक कि आपको GLEE के तहत कुछ एक्सटेंशन समर्थित नहीं किया जाता है।

+0

नवीनतम GLEW रिलीज 2012 अगस्त 06 से 1.9.0 है। –

+0

नवीनतम GLEW रिलीज अब जनवरी 26 से 1.12.0 है। इसलिए यह स्पष्ट रूप से सक्रिय रूप से समर्थित है :) – iondune

3

GLEW का उपयोग न करने के लिए 'बहुत मजबूत कारण' यह हो सकता है कि लाइब्रेरी आपके कंपाइलर/आईडीई द्वारा समर्थित नहीं है। उदा।: बोर्लैंड सी ++ बिल्डर।

उस स्थिति में, आप लाइब्रेरी को स्रोत से पुनर्निर्माण करना चाहेंगे। यदि यह काम करता है, तो बढ़िया, अन्यथा मैन्युअल एक्सटेंशन लोडिंग उतनी खराब नहीं है जितनी ध्वनि के लिए बनाई जाती है।

0

जीएल 3 डब्ल्यू एक सार्वजनिक-डोमेन स्क्रिप्ट है जो एक लाइब्रेरी बनाता है जो ओपनजीएल 3/4 के लिए केवल मूल कार्यक्षमता लोड करती है। यह कम से GitHub पर पाया जा सकता है:

https://github.com/skaslev/gl3w

GL3W अजगर 2 की आवश्यकता है।6 ओपनजीएल के लिए पुस्तकालयों और शीर्षकों को उत्पन्न करने के लिए; इसके बाद पाइथन की आवश्यकता नहीं है।