Qt-ar_logo

مقدمة ل openGL مع QtOpenGL

مكتبة openGL

مقدمة عن openGL

openGL عبارة عن مكتبة تمثل واجهة برمجية لبرمجة عتاد الجرافيكس.

ولقد صممت هذه المكتبة بطريقة حديثة وقوية وتعمل على عدة انظمة

لا توفر لك المكتبة دوال لبرمجة النوافذ ولا دوال لرسم الكائنات المعقدة مثل السيارات أو الطائرات …الخ

فقط توفر لك دوال لرسم اشكال هندسية بسيطة متعددة أضلاع أو خطوط او نقاط … الخ.

هناك مكتبة اضافية مساعدة اسمها GLU تقوم بتأدية مهمة الوظائف الشائعة والتي تحتاج الى جهد أكبر لو استخدمت مكتبة GL فقط .. مثال رسم المنحنيات , رسم مجسمات معقدة مثل الاسطوانة , انشاء مصفوفة منظورية perspective..الخ

صيغ openGL

الأوامر:

تبدأ الأوامر في openGL بالحرفين“gl” ثم بحرف كبير في كل كلمة تليها مثال ()glClearColor

تنتهي بعض أوامر openGL برقم يليها حرف صغير فالرقم يبين عدد الوسائط والحرف نوعها مثل() glVertex3f عدد الوسائط اثنتان وانواعهم float.

تنتهي بعض اوامر openGL بالحرف v الصغير ويدل هذا على ان الدالة تأخذ مؤشر في وسيطها مثال (glColor3fv(array_color

فهنا تأخذ في وسيطها مؤشر لمصفوفة من النوع float ويكون بالمصفوفة ثلاث عناصر.

الثوابت:

جميع حروفها كبيرة وتبدأ ب “_GL” وتفرق بين كل كلمة والاخرى بالعلامة “_” مثل GL_OLOR_BUFFER_BIT.

الأنواع:

وتبدأ ب “GL” ثم يليها حروف صغيرة تدل على النوع.

الجدول التالي يبين لك الأنواع openGL ومايقابلها في c وفي لاحقة الأوامر..


النوع في
openGL


النوع في
c


لاحقة الأوامر

GLbyte

Single char

b

GLshort

short

s

Glint,GLsize

int

i

GLfloat,GLclampf

float

f

GLdouble,GLclampd

double

d

GLubyte,GLboolean

Unsigned char

ub

GLushort

Unsigned short

us

GLuint,GLenum,GLbitfield

Unsigned int

ui

ملاحظة:
تتوفر في
openGL النوع GLvoid وهي في العادة تستخدم ليكون وسيط لمؤشر مصفوفة في دوال openGL.

حالة الآلة (machin state)
تعبر openGL عن حالات الآلة (machin state ) بالتحديد مع ال fixed-function pipeline فعليك ان تضع حالة لآلية ما لا تتغير الا عندما تقوم انت بتغييرها مثال ذلك اللون فعند اختيارك للون فإنه يبقى الى ان تقوم بتغيير اللون وهناك بعض الآليات تستقبل حالتين enable و disable وذلك بإستخدام الدالتين ()glEnable والدالة ()glDisable .

عملياتopenGL الاساسية أو مسار تصيير openGL:

معظم تطبيقات openGL تملك ذات الترتيب للعمليات , تؤدي تسلسل المعالجة هذه الى تصيير العنصر.

1- Display list

جميع البيانات التي لاتحتاج الى معالج فورية يتم تركيمها هنا لتعالج لاحقا.

2- Evaluators

توفر هذه المرحلة طرق
لاشتقاق الرؤوس المستخدمة لتمثيل السطوح من نقاط التحكم والطريقة هي تخريط كثيرة
الحدود التي بإمكانها انتاج السطوح .

3- Per-vertex operations and primitive assembly

في هذه المرحلة يتم معالجة الرؤوس (vertex) وفقا لمصفوفة المشهد سواء دوران او نقل وتعتبر مرحلة استعداد لل rasterization.

4- Rasterization

يتم تحويل البكسلاتوالأشكال الهندسية الى قطع (fragments)
كل قطعة عبارة عن بكسل في ال
framebuffer
ويتم ربط البيانات بها (لون وعمق…) .

5- Fragment operation

قبل ان يتم نقل القيم الى ال framebuffer كبكسلات سوف تتم هنا بعض العمليات هذه العمليات تعتمد على تفعيلك لها
enable
او disable فأول مايتم هو الإكساء ثم تليها سلسلة عمليات الألوان والضباب و z-buffer
لتصل البيانات بعد ذلك الى ال
framebuffer على شكل بكسلات تعرض على الشاشة كعالم ثلاثي الأبعاد.

ملاحظة: مصفوفة البكسلات تأخذ مسار مغاير عن المسار الذي تتخذه بيانات الرؤوس (vertex)
فالبكسلات تمر بمرحلة ال pixel operation لعمليات البكسلات ومرحلةtexture assembly لتعليم ان الصورة عبارة عن اكساء ليسهل التنقل بينها اثناء عمل البرنامج

مصطلح: framebuffer هي ذاكر تحتوي على كامل البيانات القابلة للعرض وتكون البيانات على شكل قيم ألوان لكل بكسل.

QtOpenGL
هي وحدة (module) في Qt تمكنك من انشاء تطبيقات openGL بسهولة على Qt .
يتم توجيه اعدادات Qt تلقائيا الى ملفات الرأس والمكتبة عموما , وفي حال كانت مكتبة openGL غير مثبتة في المسار المعروف لها فإنه عليك القيام بعملية التوجيه ل Qt يدويا بإستخدام كلا من الأوامر النصية QMAKE_INCDIR_OPENGL و / أو QMAKE_LIBDIR_OPENGL .
وأخيرا لكي تضيف المكتبة لمشروعك ادخل السكربت التالي داخل ملف .pro
QT+=opengl

ولتضمين ملفات الرأس أضف الكود التالي

#include <QtOpenGL>

شفرة البداية

class myGL : public QGLWidget
{
public:
myGL(QWidget *parent = 0);
~myGL();
protected:
void myGL::paintGL ();
void myGL::initializeGL ();
void myGL::resizeGL ( int width, int height );
};

الفئة QGLWidget وهي المسؤولة عن تصيير رسومات openGl .
وكلا من الدوال

void myGL::paintGL ();
void myGL::initializeGL ();
void myGL::resizeGL ( int width, int height );

معرفة مسبقا في الفئة QGLWidget واعيد تعريفها مرة أخرى لتلبي طلبات برنامجنا فالدالة paintGL تقوم برسم openGL ويتم استدعءها في كل مرة يتطلب الأمر استدعاءها, والدالة initializeGL يتم فيها تهيئة openGL وهو أول مايستدعى عند عمل البرنامج أي يتم استدعاءها قبل paintGL و resizeGL ويستدعى لمرة واحدة فقط , اما الدالة resizeGL فتستدعى في كل مرة يتغير ابعاد اطار البرنامج .
مثال تطبيق على الدوال

void myGL::paintGL ()
{
//مسح النافذة مع القيم التالية
glClear(GL_COLOR_BUFFER_BIT|//مسح للنافذة واستخدام لون الخلفية المحددة في دالة التهيئة
GL_DEPTH_BUFFER_BIT);//مسح لذاكرة العمق واستخدام القيمة في دالة التهيئة
glLoadIdentity();//تستبدل مصفوفة الإحداثيات الحالية بالوضع الأصلي لها (مصفوفة العنصر المحايد)
glColor3f(0,1,0);//لتلوين المربع
glRectf(-50.0f,-50.0f,50.0f,50.0f);//لرسم المربع بتحديد نقطة في الركن السفلي الأيسر وأخرى في أعلى اليمين
}
void myGL::initializeGL ()//دلة التهيئة اول ما ينفذ ولمرة واحدة فقط
{
glEnable(GL_DEPTH_TEST);//اذا تقاطعت بكسلات فإن الأقل عمقا تظهر والأكثر عمقا تكون تحتها فلا تظهر
glClearColor(0.5,0.5,0.5,0.5);//rgba عند تفريغ الذاكرة يتم اعتماد هذا اللون كخلفية بنظام
glClearDepth(1.0f);//تعيين قيمة العمق في حال تم مسح للنافذة
}
void myGL::resizeGL ( int width, int height )//ويتم تنفيذها كلما حصل تغيير في ابعاد النافذة
{
glViewport(0,0,width,height);//تحديد ابعاد النافذة التي ترى فيها الرسومات وهي هنا النافذة بأكملها
glMatrixMode(GL_PROJECTION);//لتحديد شكل وحجم وخريطة المشهد ونظام الإحداثيات
glLoadIdentity();//
glOrtho (-100.0,100.0,-100.0,100.0,100.0,-100.0);//تحديد أبعاد نظام الإحداثيات
glMatrixMode(GL_MODELVIEW);//الإنتقال للتحكم بمصفوفة النماذج مثل موقع النموذج والدوران
glLoadIdentity();//
}

عند تنفيذ البرنامج يخرج لنا نافذة مرسوم عليها مستطيل

وفي الأخير اقدم الشكر لكل من ساندني في تقديم هذا المقال …

495 مشاهدة

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