الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

استخدم امتدادات OpenGL في خمس خطوات

مغلق
بدأه رامي اللولح في 20 أغسطس 2005 · 6 رد · 3,615 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ، أخواني رأيت أسئلة عديدة حول هذا الموضوع ولذا قررت شرحه ببساطة شديدة:

تعتبر OpenGL من المكتبات السهلة التطوير والامتداد. حيث أنه يمكن تطوير وظائفية OpenGL فقط باستخدام امتداداتها وهذا ما يفسر دعم OpenGL لأحدث الحيل الرسومية قبل أي مكتبة أخرى !!!!!!!

كيف يتم توثيق امتدادات OpenGL

يتم تعريف امتدادت OpenGL وذلك بواسطة واصف الامتداد. واصف الامتداد عبارة عن ملف نصي. يمكنك الوصول إلى القائمة الكاملة من امتدادات OpenGL من خلال موقع SGI ، وهو المطور الرئيسي لـ OpenGL:

http://oss.sgi.com/projects/ogl-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 لكل سياق تصيير على حدة.

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

أرجو أن يكون الجميع قد استفادوا ..... ولكم مني أجمل تحية ..... والسلام عليكم !!!!!!!!!!!!!

Live Free ... Die Well

The Scorpion King

#2

عليكم السلام ..

موضوع رائع

ما اجمل ان يكون في المنتدى من يشرح لك ..... تشعر بان الامور تتغير مية وثمانين درجة .. :)

عندي كم سؤال ,,, لكن مستعجل الان ...

ورح احاول اسوي تطبيق .؛)

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

أخي الشمري .... أشكر لك مرورك ، كما أتمنى لك وللآخرين الاستفادة ...... بانتظار نتائج تجاربك ..... والله يستر !!!!!!!!!!!!

Live Free ... Die Well

The Scorpion King

#4

انا سويت تطبيق على الاكساء المتعدد ..

هو اسهل الامتدادات :) ,,,

طيب يا اخ رامي ..

احيانا بعض الامتدادات تبدأ ب ARB .. وبعضها بـ EXT .. مالفرق ..

نقطة ثانية ..

هل امتدادات شركة انفيديا .. تشتغل على كروت ATI .. .... او لازم كرت الشركة نفسها ,,

نقطة ثالثة هل .. GLSL تعتبر امتدادات .. او مالها دخل في الامتدادات .. اللي اعرفه انها لغة .. لكن ايضا ارى بعض الامتدادت التي تسمى بـVERTEX او PIXEL ... وهي امتدادات قوية ...

واذا كان عندك المزيد عن الامتدادات ... لا تقصر ... :)

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5

أخي الشمري أهلاً بك ..... وأشكر لك مداخلتك القيمة ،،،،،،

اقتباس
احيانا بعض الامتدادات تبدأ ب ARB .. وبعضها بـ EXT .. مالفرق ..

أولاً ، ARB تعني "Architecture Review Board" وهو تجمع من أضخم صانعي البطاقات الرسومية في العالم ، وتم انشاؤه عام 1992 وذلك للغرض من توحيد النظرة البرمجية لكل منتوجاتهم ضمن مظلة برمجية واحدة وقياسية ..... (مثل مبدأ XNA من Microsoft) .... !!!

تقوم ARB بإصدار جميع الخصائص والامتدادات الخاصة بـ OpenGL وتعميمها للاستخدام العالمي ضمن مواصفات وشروط دقيقة .... تأتي التحديثات دوماً عبر تحميل السائق التشغيلي لبطاقتك الرسومية !!!!!!

أعتقد أن امتدادات ARB أصبحت مفهومة الآن .... فهي جميع الامتدادات القابلة للعمل على أي بطاقة رسومية ينتمي صانعها إلى ARB ، وبالتالي GL_ARB_multitexture مثلاً سوف تعمل على بطاقات 3DLabs ، Apple ، ATI ، NVIDIA .... وغيرها من بطاقات ARB .... وذلك نظراً إلى أنه تم اختبارها والمصادقة عليها من قبل ARB

أما امتدادات EXT فهي امتدادات لم يتم المصادقة عليها أو اختبارها من قبل ARB وإن كانت من تطوير صانعين ينتمون إلى ARB .... مثل GL_ATI_separate_stencil ... حيث أن ATI أحد أعضاء ARB إلى أن هذا الامتداد لم يتم اختباره أو المصادقة عليه من قبل ARB جميعهم !!!!!!

اقتباس
هل امتدادات شركة انفيديا .. تشتغل على كروت ATI .. .... او لازم كرت الشركة نفسها ,,

إذا كان الامتداد ARB فسوف يعمل لأنه قياسي حسب توصيف وثائق ARB .... أما إذا كان من خارج ARB فعليك قراءة واصف الامتداد فيما يخص كيفية تهيئة الامتداد واستخدامه .... لكن هذا لا يعني أن النتائج سوف تكون مماثلة 100%

اقتباس
هل .. GLSL تعتبر امتدادات

أولاً هي متوافقة مع أبناء عمومتها من لغات NVIDIA أو CG .... إلا أنها أقرب إلى OpenGL فهي الأم .... فهي لغة بحد ذاتها ، وتكتب عادة بالـ C تحديداً ويتم تصريفها خارج شفرة التطبيق الفعلي ومن ثم يتم ربطها بالتطبيق الفعلي لا حقاً ..... وإليك المعلومة التالية: "إذا كان حاسوبك يدعم OpenGL 2.0 عندها يمكنك استخدام GLSL مباشرة دون الحاجة إلى استخدام امتدادات ARB ، أما مع أي إصدار أدنى من OpenGL 2.0 فعليك استخدام امتدادات المظللات لخلق كائن التظليل"

اقتباس
ارى بعض الامتدادت التي تسمى بـVERTEX او PIXEL ... وهي امتدادات قوية ...

بعض هذه الامتدادات خاص بلغة التظليل مثل:

GL_ARB_fragment_shader

GL_ARB_vertex_shader

GL_ARB_shader_object

GL_ARB_shading_language_100

وبعضها لأغراض أخرى .... لذلك اقرأ واصف الامتداد !!!!!!!!

اقتباس
واذا كان عندك المزيد عن الامتدادات ... لا تقصر ...

http://glew.sourceforge.net

وسوف أقوم بوضع أمثلة لاحقاً عن كيفية التعامل مع OpenGL Shading Language Extensions .... والله الموفق ،،،،،

Live Free ... Die Well

The Scorpion King

#7

ياسيدي .... جزاك الله خير !!!!!!!!

Live Free ... Die Well

The Scorpion King

هذا الموضوع مغلق.

مواضيع مشابهة