سؤال

كنت على وشك إعادة بناء مكتبتي في Dev-C++، ضمن Windows؛ومع ذلك، فإن وظيفة التظليل التي أضفتها في هذه الأثناء غير مدعومة، ولم يتمكن المترجم من العثور على الوظائف ذات الصلة (::glCreateShader()، ::glCreateProgram()، وما إلى ذلك)

من خلال البحث في الإنترنت ومجلد Dev-C++، وجدت أن تطبيق OpenGL (gl.h) هو الإصدار 1.1 فقط.لقد وجدت توصيات لتحميل أحدث الرؤوس من SGI.لقد وجدت gl3.h، ومع ذلك، بعد التدقيق الدقيق، أدركت أن gl.h لم يتم تضمينه في مشروعي على أي حال، ويجب أن أبحث في SDL/SDL_opengl.h.

يحرر: SDL_opengl.h يفعل تشمل gl.h و تعلن نماذج أولية للوظائف المعنية.لذا فإن السؤال هو، لماذا أعطي أخطاء وقت الترجمة بدلاً من أخطاء الرابط؟

(ترتبط مكتبتي فقط بـ mingw32 و libOpenGL32 و libSDL و libSDL_Image و libSDL_Mixer، تمامًا كما هو الحال في OSX (باستثناء mingw32 بالطبع) حيث لم أواجه أي مشكلة.)

كيف يمكنني استخدام تظليل OpenGL v2.0 مع Dev-C++ وSDL؟

هل كانت مفيدة؟

المحلول

gl.h مخصص فقط لـ OpenGL 1.1 (وفي بعض الحالات يصل إلى 1.3 اعتمادًا على إصدار الملف الذي تستخدمه ونظام التشغيل).لكل شيء آخر تحتاجه أيضًا جليكست.ح وربما glxext.h (لينكس/يونكس) أو wglext.h (شبابيك).

يجب ربط جميع الوظائف من الإصدارات الأحدث من OpenGL في وقت التشغيل.لذلك، من أجل استخدامها، يجب عليك الحصول على عنوان الوظيفة الصحيح وتعيينه لمؤشر الوظيفة.أسهل طريقة للقيام بذلك هي باستخدام شيء مثل توهج.

الطريقة اليدوية ستكون كالتالي:

PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC) wglGetProcAddress("glCreateShader");

أو لنظام التشغيل Linux:

PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC) glXGetProcAddress((GLubyte*) "glCreateShader");

إذا قمت بتعريف GL_GLEXT_PROTOTYPES قبل تضمين glext.h، فيمكنك حذف السطر الأول.

يحرر: يبدو أن SDL_opengl.h يحتوي على نسخة من glext.h (غير محدثة).لذلك إذا كنت تستخدم ما ورد أعلاه فيجب أن يظل صالحًا.إذا كنت تريد استخدام glext.h منفصل، فيجب عليك تحديد NO_SDL_GLEXT قبل تضمين SDL_opengl.h.كما أن النماذج الأولية للوظائف غير متاحة طالما لم يتم تعريف GL_GLEXT_PROTOTYPES أو أنك تكتبها بنفسك.

تحرير 2: يبدو أن SDL لديها وظيفة GetProcAddress الخاصة بها والتي تسمى SDL_GL_GetProcAddress.

نصائح أخرى

هل يمكنك تحميل عناوين الوظائف في وقت التشغيل؟

typedef GLhandle (APIENTRYP PFNGLCREATESHADERPROC) (GLenum shaderType);
PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");

typedef GLhandle (APIENTRYP PFNGLCREATEPROGRAMPROC) ();
PFNGLCREATEPROGRAMPROC glCreateProgram = NULL;
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top