السلام عليكم :
الضباب .
كيف نسوي ضباب في OPENGL ..
المسألة سهلة جدا .. وبما أنها سهلة فسأكتب هذا الموضوع :P ان شاء الله .
نحتاج الى ثلاث معلومات ..
لون الضباب .. هل تريده ابيض كالمعتاد .. او... حسب احداث لعبتك طيبة الذكر .
كثافة الضباب ..
مدى الضباب ..
نوع الضباب ..ويوجد عدة انواع يقدمها لك OPENGL على طبق من ذهب .
تخيل مدى سهولة OPENGL ... تخيل ..
هاه تخيلت ...
اذا كنت تتوقع ان الكود ستمية وسبع طعش سطر .. لاننا نتحدث عن ضباب ..
فانت غلطان .. لان الكود .. كله ربع سطر .
glFogf
اذا كنت تريد تمرير قيمة لها ,,
glFogfv
اذا كنت تريد تمرير مصفوفة لها مثل مصفوفة ألوان ...
خلونا نشوف الكود على طول
/*1*/ float fog_colour[] = {0.6f,0.58f,0.79f,0.0f};
/*2*/ void Init()
/*3*/ {
/*4*/ glClearColor(0.6f,0.58f,0.79f,0.0f);
/*5*/ glFogf (GL_FOG_START, 0.3f);
/*6*/ glFogf (GL_FOG_END, 200);
/*7*/ glFogfv(GL_FOG_COLOR, fog_colour);
/*8*/ glFogi (GL_FOG_MODE, GL_EXP);
/*9*/ glFogf (GL_FOG_DENSITY,0.05f);
/*10*/ // enable the fog
/*11*/ glEnable(GL_FOG);
/*12*/ glEnable(GL_DEPTH_TEST);
/*13*/ glEnable(GL_LIGHT0);
/*14*/ glEnable(GL_LIGHTING);
/*15*/ }في السطر الاول أعلنا عن مصفوفة .. ستحمل لون الضباب ..
اخترنا لون ابيض مائل الى البنفسجي .. ( ليس انا من اختار هذا اللون انما لقيته في احد الاكواد :) )
في السطر الرابع جعلنا لون الخلفية ل opengl هي نفسها لون الضباب وهذا مهم جدا ..حتى نعطي للمشهد واقعية .
في السطر الخامس والسادس حددنا مدى الضباب.
في السطر السابع استدعينا الدالة glFogfv .. لاحظ حرف v وهذا يعني اننا سنمرر لها مصفوفة ..
في البارمتر الاول مررنا لها الثابث : GL_FOG_COLOR . يعني لون الضباب
وفي البامتر الثاني مررنا له اللون الذي نريده .. وهو عنوان المصفوفة السابقة ,
حقيقة .. تحتاج الى تغيير في القيم لتجد الفرق ولتفهم ..
جرب ان تجعل المدى البعيد 30 ...
والمدى القريب .. 1 .. فهذا جيد . . . أو على حسب رغبتك .
في السطر الثامن نوع الضباب .. GL_FOG_MODE ..
ويأخذ
GL_EXP او GL_EXP2 او GL_LINEAR
الان اخترنا الاولى , , , وسنفصل لاحقا ..
في السطر التاسع حددنا كثافة الضباب .. GL_FOG_DENSITY ..
طبعا قللها قدر الامكان .. لانك اذا زودتها ما راح تشوف شيء . . .
الا اذا كانت لعبتك طيبة الذكر تتطلب ضباب كثيف :D
وفي السطر 11 فعلنا الضباب .. والسلام ..
وهذه بعض الملاحظات :
1- حاولت استخدم Blending مع الضباب .. لكن النتائج غير مرضية .. .. ..
سأبحث في هذه المشكلة .. إذا احد من الااخوان يعرف شيء عن هذه النقطة يخبرنا ..
2- GL_LINEAR هو افضل انواع الضباب .. فهو يعطيك عمق رائع ..
يعني .. اذا كنت تشاهد مجسم من بعيد .. يكون كله ضباب ..
وعندما تقترب منه ينقشع الضباب بشكل .. جذااااااااااب ..
بعكس .. الضباب .. GL_EXP .. فهو يملأ الشاشة بالكامل بالضباب .. ولايعطيك ذلك التصور الجذاااااااااب .
3-
glHint (GL_FOG_HINT, GL_DONT_CARE);
السطر السابق وجدته في NeHe بعد ان قمت بمراجعة درسه عن الضباب ..
هو قال لا اهتم بالFOG HINT ..
تستطيع تمرير قيم اخرى :
GL_NICEST - GL_FASTEST
لكن اذا كنت مهتما فابحث عن التفاصيل في الكتاب الاحمر ... اخوك متعاجز : ) ,,
ولكن حسب ما قرأت اليك التالي :
GL_DONT_CARE : تعني لا اهتم بنوعية الضباب .. هل هو per vertex او per pixel
per vertex
تعني لكل رأس .. يجعل OPENGL الضباب لكل رأس من الشكل .. . .
per pixel
الضباب لكل نقطة ..
GL_NICEST : الضباب لكل نقطة per pixel .. وهذا افضل .
GL_FASTEST : الضباب لكل رأس .. هذا اسرع وليس افضل .
تذكر دائما .. السرعة ستكون على حساب النتيجة الافضل .. والعكس صحيح .
5- يوجد ضباب جديد ... تلقاه في امتدادات OPENGL الجديدة ..
وهو مدعوم من اغلب كروت العرض ..
لدرجة انه مدعوم في كرت الشاشة عندي ... تخيل !!!
ابحث في Google عن
glFogCoordf
Volumetric Fog
او مباشرة اذهب الى الدرس رقم 41 من دروس Nehe
والتطبيق الصغير بالمرفقات .
والتحريك بالاسهم .. و Home - END لتحريك الكاميرا .
لكن فقط باستخدام المكتبة GLUT . . هجرنا الWIN APIs : ) ,,
