الصفحة الرئيسية/ التقنية / رسم مربع بواسطة OpenGL : دورة OpenGL لغة c++ الدرس الخامس

رسم مربع بواسطة OpenGL : دورة OpenGL لغة c++ الدرس الخامس


for Large تمت الكتابة بواسطة : محمد

for Large for Mobile

رسم مربع بواسطة OpenGL يتطلب الإلمام ببعض المهام الرئيسية في المثلثات حيث لا تختلف الطريقة كثيرا عنها.

كما تتطلب عملية الاستدعاء زيادة في عدد الإحداثيات التي ستتضح فيما بعد أنها عبارة عن مثلثين بــ6 أضلاع.

وكذلك الأمر بالنسبة لمكونات EBO (Element buffer object).[1].

حيث يمكن رسم مربع بواسطة OpenGL عن طريق دمج مثلثين من الإحداثيات.

وبالتالي فإن كافة النماذج المتعلقة بالرسم تتكون بواسطة علم المثلثات.

 

 

رسم مربع بواسطة OpenGL

يمكن رسم مربع من حيث تعيين بعض الإحداثيات المتعلقة بنقاط الرسم.

ويجري التعديل على أطوال أضلاع المثلث من أجل إخراج النتيجة على النحو المطلوب.[1]

نقوم الآن بعمل تعديل لازم على الشيفرة من خلال تعبئة الإحداثيات من مصفوفة vertices.[1]

GLfloat vertices[] = {
// First triangle
0.5f, 0.5f, 0.0f, // Top Right
0.5f, -0.5f, 0.0f, // Bottom Right
-0.5f, 0.5f, 0.0f, // Top Left
// Second triangle
0.5f, -0.5f, 0.0f, // Bottom Right
-0.5f, -0.5f, 0.0f, // Bottom Left
-0.5f, 0.5f, 0.0f // Top Left
};

تعتبر مصفوفة الأحداث في الأعلى الجزء المسؤول عن رسم مربع بواسطة OpenGL.

حيث أن أول ثلاث إحداثيات تشكل المثلث الأعلى الأيمن.

بينما آخر ثلاث إحداثيات ستشكل المثلث السفلي الأيسر.

بالتالي نحصل على 6 مواقع إحداثيات أساسية لكل مربع يتم تكوينه في جميع رسومات الحاسوب

جميع مكونات الرسم 3D 2D هي بالأساس مثلثات يتم دمجها معا  لتصبح مربع ، مثل الأبنية أو المركبات أو الأشجار التي غالبًا ما تعتبر أعقد أنواع النماذج في علم المثلثات.

 

تكوين EBO (Element Buffer Object)

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

ولذلك يعود الفضل لـ EBO في تقديم طريقة من  بطاقة العرض ، يتم من خلالها معرفة خريطة رسم القلم.[1]

على سبيل المثال ، أفضل تعبير لعملية الرسم هو أن هناك قلم بالفعل يريد معطيات الرسم قبل أن يبدأ بإجراء التعبئة.[1]

ويقدم مخزن EBO مصفوفة تدل على إحداثيات مربع بالفعل ، لكن معالجتها تتم عبر المثلثات.

ما يعني أن كود الإحداثيات سوف يتكون من متغيرين. الأول مصفوفة بأربع إحداثيات والثاني هو مصفوفة تحدد مؤشرات الرسم.

GLfloat vertices[] = {
0.5f, 0.5f, 0.0f, // Top Right
0.5f, -0.5f, 0.0f, // Bottom Right
-0.5f, -0.5f, 0.0f, // Bottom Left
-0.5f, 0.5f, 0.0f // Top Left
};
GLuint indices[] = { // Note that we start from 0!
0, 1, 3, // First Triangle
1, 2, 3 // Second Triangle
};

لو قمنا بالتركيز على عناصر المتغير indices نجد بأن هناك نقطة تلاقي بين المثلثين (عامل مشترك) وهي الرقم 1.

والتي تدل فعليًا على إحداثيات Bottom right. ما يعني أن القلم سيبدأ برسم المثلث الثاني من إحداثيات أسفل يمين الفضاء.

 

تعريف EBO في الشيفرة

يتطلب رسم مربع بواسطة OpenGL تعريف متغير EBO في الكود الخاص بنا ليصبح شكل المتغيرات على النحو التالي:

GLuint EBO;
glGenBuffers(1, & EBO);

وبطريقة مشابهة لكائن VBO يمكن الآن ربط EBO مع الإشارة إلى indices بمتغيرات الدالة لتصبح تمامًا كما يلي:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); -hj
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices,
GL_STATIC_DRAW);

نلاحظ بأننا نعطي GL_ELEMENT_ARRAY_BUFFER قيمة EBO التي قمنا بملئها مسبقًا ويتبقى لدينا استبدال الدالة glDrawArrays لتحل glDrawElements مكانها تمامًا مثل الكود التالي:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

ومن خلال الكود السابق يمكن رسم مربع بواسطة EBO حيث يتم ملئ القيم كما في الكود السابق.

 توفر القيمة الأولى نوع النمط الذي يراد استخدامه وهو مثلثات والقيمة الثانية هي عدد المؤشرات التي نحتاج التوصيل بينها indices.

بينما القيمة الثالثة تدل على نوع المتغير وهو بالطبع GL_UNSIGNED_INT ما يسمح بقراءة قيم EBO السالبة.[1]

يتم الإبقاء على قيمة الإزاحة 0 كما هي.[1]

الآن وبعد تطبيق كافة الخطوات السابقة ستظهر نتيجة الرسم النهائية ، كما في الصورة التالية.

 

رسم مربع بواسطة OpenGL

     

المراجع

  1. [1]^ كتاب ـــــــ offline learn OpenGL created by Joey de Vries.
  2. [2]^الشيفرة من المصادر.

وقت النشر : 2023-02-04 20:31:38 ·

1    التصنيفات






2    مقالات من التقنية

يعتمد هذا الموقع على عرض الإعلانات في تحقيق الدخل ، نشكر تفهمكم الدائم ونتمنى لكم قضاء وقت رائع ... وشكراً :D .