استخدام ملحقات OpenGL على نظام التشغيل Windows

StackOverflow https://stackoverflow.com/questions/14413

  •  08-06-2019
  •  | 
  •  

سؤال

أريد استخدام الوظائف المكشوفة ضمن امتدادات OpenGL.أنا على نظام التشغيل Windows، كيف أفعل ذلك؟

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

المحلول

حل سهل:يستخدم توهج.أنظر كيف هنا.

الحل الصعب:اذا كان لديك سبب قوي حقا عدم استخدام GLEW، وإليك كيفية تحقيق ذلك بدونه:

حدد امتداد OpenGL وواجهات برمجة تطبيقات الامتداد التي ترغب في استخدامها.يتم إدراج ملحقات OpenGL في ملف سجل ملحق OpenGL.

مثال:أرغب في استخدام قدرات EXT_framebuffer_object امتداد.واجهات برمجة التطبيقات التي أرغب في استخدامها من هذا الامتداد هي:

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

تحقق مما إذا كانت بطاقة الرسوميات الخاصة بك تدعم الامتداد الذي ترغب في استخدامه.إذا حدث ذلك، فهذا يعني أن عملك قد انتهى تقريبًا!قم بتنزيل وتثبيت أحدث برامج التشغيل ومجموعات SDK لبطاقة الرسومات الخاصة بك.

مثال:بطاقة الرسومات الموجودة في جهاز الكمبيوتر الخاص بي هي نفيديا 6600 جي تي.لذا قمت بزيارة مواصفات ملحق NVIDIA OpenGL صفحة الويب وتجد أن EXT_framebuffer_object يتم دعم التمديد.ثم أقوم بتنزيل الأحدث نفيديا OpenGL SDK وتثبيته.

توفر الشركة المصنعة لبطاقة الرسومات الخاصة بك جليكست.ح ملف رأس (أو ملف رأس مسمى بشكل مشابه) مع جميع الإعلانات اللازمة لاستخدام امتدادات OpenGL المدعومة.(لاحظ أنه قد لا تكون جميع الامتدادات مدعومة.) إما أن تضع ملف الرأس هذا في مكان يمكن للمترجم الخاص بك التقاطه أو تضمين دليله في قائمة أدلة التضمين الخاصة بالمترجم الخاص بك.

أضف #include <glext.h> سطر في التعليمات البرمجية الخاصة بك لتضمين ملف الرأس في التعليمات البرمجية الخاصة بك.

يفتح جليكست.ح, ، ابحث عن واجهة برمجة التطبيقات (API) التي ترغب في استخدامها واحصل على ما يقابلها قبيح المظهر تصريح.

مثال:أبحث عن واجهات برمجة تطبيقات Framebuffer المذكورة أعلاه وأجد إعلاناتها القبيحة المقابلة:

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

كل هذا يعني أن ملف الرأس الخاص بك يحتوي على إعلان API في نموذجين.أحدهما عبارة عن إعلان مؤشر دالة قبيح يشبه wgl.والآخر هو إعلان وظيفة عاقل المظهر.

لكل واجهة برمجة تطبيقات ملحقة ترغب في استخدامها، أضف إعلانات التعليمات البرمجية الخاصة بك لاسم الوظيفة كنوع من السلسلة القبيحة المظهر.

مثال:

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

على الرغم من أن الأمر يبدو قبيحًا، إلا أن كل ما نفعله هو الإعلان عن مؤشرات دالة من النوع المطابق لواجهة برمجة تطبيقات الامتداد.

قم بتهيئة مؤشرات الوظائف هذه بوظائفها الصحيحة.يتم الكشف عن هذه الوظائف بواسطة المكتبة أو برنامج التشغيل.نحن بحاجة لاستخدام wglGetProcAddress() وظيفة للقيام بذلك.

مثال:

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

لا تنس التحقق من مؤشرات الوظيفة باطل.لو عن طريق الصدفة wglGetProcAddress() تعذر العثور على وظيفة الامتداد، لكان قد تم تهيئة المؤشر باستخدام NULL.

مثال:

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);

مرجع: الانتقال إلى ما بعد OpenGL 1.1 لنظام التشغيل Windows بقلم Dave Astle - المقالة قديمة بعض الشيء، ولكنها تحتوي على كل المعلومات التي تحتاجها لفهم سبب وجود هذا الموقف المثير للشفقة على Windows وكيفية التغلب عليه.

نصائح أخرى

قد يكون "السبب القوي جدًا" لعدم استخدام GLEW هو أن المكتبة غير مدعومة من قبل المترجم/IDE الخاص بك.على سبيل المثال:بورلاند C++ منشئ.

في هذه الحالة، قد ترغب في إعادة بناء المكتبة من المصدر.إذا نجح الأمر، فهذا رائع، وإلا فلن يكون تحميل الامتداد اليدوي سيئًا كما يبدو.

@كرونيكارز:من مظهره، توهج يبدو أن هذا هو الطريق للمستقبل.تقوم NVIDIA بالفعل بشحنها مع برنامج OpenGL SDK.وآخر إصدار لها كان في عام 2007 مقارنة بـ GLEE الذي كان في عام 2006.

لكن استخدام كلتا المكتبتين يبدو متماثلًا تقريبًا بالنسبة لي.(GLEW لديه فيه() والذي يجب استدعاؤه قبل أي شيء آخر.) لذا، لا تحتاج إلى التبديل إلا إذا وجدت بعض الامتدادات غير مدعومة ضمن GLEE.

GL3W هو برنامج نصي للمجال العام يقوم بإنشاء مكتبة تقوم بتحميل الوظائف الأساسية فقط لـ OpenGL 3/4.ويمكن العثور عليها على جيثب في:

https://github.com/skaslev/gl3w

يتطلب GL3W إصدار Python 2.6 لإنشاء المكتبات والرؤوس الخاصة ببرنامج OpenGL؛لا يتطلب بايثون بعد ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top