الصفحة الرئيسية/ التقنية / خريطة الإضاءة : دورة OpenGL لغة c++

خريطة الإضاءة : دورة OpenGL لغة c++


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



خريطة الإضاءة وبالإنجليزية lighting map تقدم خريطة الإضاءة رسومات أكثر مرونة للكائن ، حيث تتيح استخدام أكثر من مادة Material في استقبال الإضاءة.[1]

على سبيل المثال لو نظرنا إلى السيارة في العالم الحقيقي لوجدنا أن لكل جزء منها خصائص فريدة في الانعكاسات.

مثل الزجاج الذي يعكس ما حولة من تضاريس بالإضافة إلى المعدن الذي يقدم انعكاسًا بطريقة أقل دقة.[1]

تقدم خريطة الإضاءة مصادر كافة لاستقبال الضوء حيث نجد بأن جميع مواد الإضاءة لا تكفي لكافة العناصر الموجودة في فضاء الرسم دون استخدام خريطة للإضاءة.[1]

 

 

 



تمكين خريطة الإضاءة


يمكن تمكين خريطة الإضاءة من خلال ضبط ضوء الانتشار لكائن ما لكل سطح خاص به.

يعد استخدام النسيج Texture أحد أهم العوامل التي تعمل بالتزامن مع خريطة الإضاءة ، حيث يتم استخدامه Diffuse map بطريقة مماثلة بالمقارنة مع درس النسيج Texture.

بالتالي يمكن تخزين النسيج على أنه متغير داخل Structure التي قمنا بتعيينها في درس المواد  ، بينما يتم استبدال جميع معاملات الإضاءة بـ Diffuse map.[1]  

 


إجراء تغييرات على ملفات الظلال


لكي نتمكن من تفعيل خريطة الإضاءة يجب أولا إعلام ملف model.frag بذلك .[1]

سوف نقوم بحذف إضاءة كل من ambient و Diffuse و specular بالتالي يصبح الــ structure على النحو التالي:

struct Material {
sampler2D diffuse;
vec3 specular;
float shininess;
};
...
in vec2 TexCoords;

وفي حال أننا نعمل على تضمين إحداثيات النسيج في ملف model.frag.[1] سوف يقودنا ذلك إلى إجراء تعديل بسيط على متغير diffuse الذي قمنا بإعداده سابقا ليصبح على النحو التالي:

vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse,
TexCoords));

وكذلك الأمر بالنسبة لمتغير ambient سوف نقوم بضم متغير texture إليه بالتالي يصبح على النحو التالي:

vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords));

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

على سبيل المثال ، نحتاج إلى تعيين مصفوفة جديدة من الإحداثيات تجدها في المصادر أدناه.[3]

تتضمن الإحداثيات المواقع المتعلقة بالمكعب ومتجهات normal وأيضا إحداثيات النسيج.

وبعد أن قمنا بإجراء كافة التعديلات عليها يجب أن نعلم ملف model.vs بأماكن الإحداثيات الجديد.

لا ننسى إجراء تحديثات جديدة على الصفات وذلك باستقبال قيم model.vs الجديدة مع تفعيل صفات النسيج.

بالتالي يتعين إضافة الكود التالي إلى المشروع.

//Texture attribute
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
    glEnableVertexAttribArray(2);

نقوم الآن بإضافة خاصية diffuse على النسج المطبق عن طريق الكود التالي:

lightingShaders->Use();
    glUniform1i(glGetUniformLocation(lightingShaders->Program, "material.diffuse"), 0);

نعود الآن إلى مكتبة SOIL التي تقوم بتحميل النسيج والصور المتعددة إلى المشروع ، حيث نقوم بتنفيذ حزمة النسيج كاملة على النحو التالي:

glGenTextures(1, &diffuseMap);
    int width, height;
    unsigned char* image;
    // Diffuse map
    image = SOIL_load_image("C:/GL/container2.png", &width, &height, 0, SOIL_LOAD_RGB);
    glBindTexture(GL_TEXTURE_2D, diffuseMap);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
    glGenerateMipmap(GL_TEXTURE_2D);
    SOIL_free_image_data(image);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST_MIPMAP_NEAREST);
    glBindTexture(GL_TEXTURE_2D, 0);

    lightingShaders->Use();
    glUniform1i(glGetUniformLocation(lightingShaders->Program, "material.diffuse"), 0);

وفي حلقة while نقوم بتفعيل النسيج مع خصائص diffuse map:

// Bind diffuse map
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, diffuseMap);

 

 

المراجع

  1. [1]^ كتاب ـــــــ offline learn OpenGL created by Joey de Vries.
  2. [3]^إحداثيات النموذج.
  3. [4]^مصادر من model.frag.

وقت النشر : 2023-02-04 21:29:04 ·

1    التصنيفات






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

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