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