السلام عليكم ، أخواني رأيت أسئلة عديدة حول هذا الموضوع ولذا قررت شرحه ببساطة شديدة:
تعتبر 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;
الخطوة الثالثة
علينا أن نتفحص أولاً فيما إذا كان الامتداد مدعوماً من قبل السائق التشغيلي "Driver" والبطاقة الرسومية وذلك من خلال استدعاء الوظيفة isExtensionSupported. في الواقع ، عليك كتابة هذه الوظيفة بنفسك ، حيث يمكن أن تكتب ببساطة على النحو:
// 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.
}
الخطوة الرابعة
علينا التحقق فيما إذا كانت الامتداد هو متوفر فعلاً. بالتالي ، علينا استخدام الوظيفة wglGetProcAddress وذلك لتمرير عنوان الوظائف في السائق التشغيلي لـ OpenGL إلى متغيرات الوظائف التالية:
// Check if the extension is there.
int hasPointParams = isExtensionSupported("GL_EXT_point_parameters");
// Initialize the extension-functions.
#ifdef _WIN32 // for windows only
if (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();
ملاحظة
إن وظائف الامتداد تكون فعالة فقط مع سياق تصيير OpenGL الذي قمت بتهيئته مسبقاً. بحيث إذا كنت تعمل مع أكثر من سياق تصيير واحد ، فإنه عليك استخدام العنوان المعاد من الوظيفة wglGetProcAddres ، وإلا فأنت عرضة لمشاكل عديدة . باختصار ، عليك تهيئة وظيفة الامتداد باستدعاء wglGetProcAddress لكل سياق تصيير على حدة.
الآن قد لا تحصل على نفس التأثير المرغوب عند استخدامك امتداداً ما ، وهذا يرجع إلى تعدد البطاقات الرسومية وبالتالي قد يكون الامتداد مختلفاً من بطاقة رسومية إلى أخرى !!!!!
أرجو أن يكون الجميع قد استفادوا ..... ولكم مني أجمل تحية ..... والسلام عليكم !!!!!!!!!!!!!