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


خريطة الإضاءة وبالإنجليزية lighting map. لقد ناقشنا في الدرس السابق امكانية امتلاك كل كائن على مادة فريدة من استقبال الأضواء يعتبر ذلك جيدًا عند إعطاء كائن ما إضاءة جيدة مقارنة مع غيره.[1]تقدم خريطة الإضاءة رسومات أكثر مرونة للكائن حيث تتيح استخدام أكثر من مادة Material في استقبال الإضاءة.[1] على سبيل المثال لو نظرنا إلى السيارة في العالم الحقيقي لوجدنا أن لكل جزء منها خصائص فريدة في الانعكاسات. مثل الزجاج الذي يعكس ما حولة من تضاريس بالإضافة إلى المعدن الذي يقدم انعكاسًا بطريقة أقل دقة.[1]

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



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



كل ما نحتاجه في خريطة الإضاءة هو طريقة ما تعمل على ضبط ضوء الانتشار لكائن ما لكل سطح خاص به. لربما يعد استخدام النسيج Texture عامل مهم في الحصول على فائدة حقيقية لهذا الدرس.[1]

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

 

في حال لم يكن لديك نسيج Texture يمكنك تحميل نسيج خشبي في المصادر أدناه.[2]

 


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



لكي نتمكن من تفعيل خريطة الإضاءة يجب أولا إعلام ملف 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));

كل ما تم فعله سابقا هو مجرد دمج بسيط لخريطة الإضاءة بالتالي سوف تلاحظ لا شيء جديد ليتم ارفاقه.[1] لكن يتطلب منا إجراء التحسينات على إحداثيات النموذج. على سبيل المثال , سوف نحتاج إلى تعيين مصفوفة جديدة من الإحداثيات تجدها في المصادر أدناه.[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);
خريطة الإضاءة
صورة يظهر فيها تمكين خريطة الإضاءة على مشروع OpenGL.

 

يمكنك العثور على المصادر كاملة في  أسفل المراجع.

 

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *