السلام عليكم ، أخواني رأيت أسئلة عديدة حول هذا الموضوع ولذا قررت شرحه ببساطة شديدة: تعتبر OpenGL من المكتبات السهلة التطوير والامتداد. حيث أنه يمكن تطوير وظائفية OpenGL فقط باستخدام امتداداتها وهذا ما يفسر دعم OpenGL لأحدث الحيل الرسومية قبل أي مكتبة أخرى !!!!!!! كيف يتم توثيق امتدادات OpenGL يتم تعريف امتدادت OpenGL وذلك بواسطة واصف الامتداد. واصف الامتداد عبارة عن ملف نصي. يمكنك الوصول إلى القائمة الكاملة من امتدادات OpenGL من خلال موقع SGI ، وهو المطور الرئيسي لـ OpenGL: http://oss.sgi.com/p...sample/registry هذه الواصفات لم تكتب على شكل أمثلة برمجية ، لكن المبرمج ومن خلال قراءة الواصف يستطيع بوضوح أن يعلم كيفية استخدام أحد هذه الامتدادات. استخدام امتدادات OpenGL نحن نتحدث الآن عن امتداد وظائفي لـ OpenGL ، لذلك دعنا نتأكد فقط من أن هذه الوظائفية غير موجودة أصلاً ضمن مكتبة OpenGL القياسية. ولهذا السبب ، ولاستخدام امتداد ما علينا تهيئة بعض البارامترات والوظائف وذلك باستخدام مؤشر الوظيفة أو (Function Pointer). وكمثال على عملية التهيئة سوف أستخدم الامتداد من نوع "EXT_point_parameter". وسوف تبدأ الخطوات على الشكل التالي: الخطوة الأولى أولاً ، علينا التصريح عن هيكل الوظيفة ، وهو نفسه الموجود في واصف الامتداد:
typedef void (APIENTRY * PFNGLPOINTPARAMETERFEXTPROC)(GLenum pname, GLfloat param);typedef void (APIENTRY * PFNGLPOINTPARAMETERFVEXTPROC)(GLenum pname, const Glfloat *params);
PFNGLPOINTPARAMETERFEXTPROC glPointParameterfEXT;PFNGLPOINTPARAMETERFVEXTPROC glPointParameterfvEXT;
// This function returns true (1) if the extension is there.int isExtensionSupported(const char *extstring){ char *s = (char*) glGetString(GL_EXTENSIONS); //Get our extension-string char *temp = strstr(s, extstring); //Is our extension a string? return temp != NULL; //Return false.}
// Check if the extension is there.int hasPointParams = isExtensionSupported("GL_EXT_point_parameters");// Initialize the extension-functions.#ifdef _WIN32 // for windows onlyif (hasPointParams){ glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC) wglGetProcAddress("glPointParameterfEXT"); glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC) wglGetProcAddress("glPointParameterfvEXT");}#endif
if (hasPointParams) // If the extension is available{ static float quadratic[3] = { 0.25, 0.0, 1/60.0 }; glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, quadratic); glPointParameterfEXT(GL_POINT_FADE_THRESHOLD_SIZE_EXT, 1.0);}RenderScene();