ربط OpenGL بالCpp عن طريق مكتبة SDL .

الناقل : elmasry | الكاتب الأصلى : الشمري | المصدر : www.arabteam2000-forum.com

السلام عليكم .

كما نعرف يمكن استخدام Win32 API لهذا الغرض , ولكن يقولون أنها صعبة ولا تسمح بنقل اللعبة لتعمل على بيئة اللينوكس مثلا .
وكما نعرف يمكن استخدام المكتبة GLUT لهذا الغرض ولكن يقولون انها سهلة جدا لدرجة انك تفقد السيطرة على برنامجك .. والLOOP فيها عبيط او يستعبط .
قالوا لماذا لا نوجد البديل ..
ظهرت بضع من المكتبات ( من 3 الى 9 مكتبات :) ) هي عبارة عن FrameWork ( اطار ) للOpenGL ..
تسمح للمطورين بربط OpenGL بالنافذة .. باستقبال المدخلات من الكيبورد او الماوس ..الخ .
من هذه المكتبات SDL .
لماذا SDL ؟
حقيقة لا اعرف الجواب .. لكن سأتكلم عما اشعر به .
هي مكتبة اكثر صلابة .. اكثر انتشارا .. متطورة ,,
هي كلمات عامة لكن هناك امور اكثر تفصيلا ومنها :
- تمكنك من بناء العاب ثنائية الابعاد بدون استخدام OpenGL .
- توفر عدد من المكتبات التيي تعد من ذهب .. مثل مكتبات الصور / الشبكات / الاصوات / الخطوط / وهي تأتي منفصلة عن المكتبة الام SDL .

على العموم .. شاهد هذه الروابط ,
مثال عمل animation في SDL

TUTORIALS





ما نريده الان هو ربط OpenGL بالنظام عن طريق ال SDL .

الخطوات :

1 - سأفرض أنك تملك المكتبة وقد قمت بتثبيتها عندك وقمت بعمل برامج تطبيقية عليها ..
( ما لي نفس أشرح شيء سهل وبسيط ) ,

ولكن هناك أمور ممكن تحتاجها ,,

اذا كنت تعمل على الفيجوال سي .. فتحتاج خطوات اضافية :
1 - أنشئ مشروع جديد من نوع Console .

2- Alt + F7

4- انظر الصورتين وطبق ما تراه .

Resized to 90% (was 721 x 281) - Click image to enlargeارفق صورة : monthly_07_2007/post-42837-1183303063.jpg


ارفق صورة : monthly_07_2007/post-42837-1183303070.jpg

الان ألصق هذا الكود .


#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <SDL/SDL.h>

#   pragma comment (lib, "opengl32.lib")  /* link with Microsoft OpenGL lib */
#   pragma comment (lib, "glu32.lib")    /* link with Microsoft OpenGL Utility lib */

#   pragma comment (lib, "sdl.lib")
#   pragma comment (lib, "sdlmain.lib")



int main( int argc, char* argv[] )
{
SDL_Init(SDL_INIT_VIDEO);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);                //Use at least 5 bits of Red
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);      //Use at least 5 bits of Green
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);               //Use at least 5 bits of Blue
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);     //Use at least 16 bits for the depth buffer
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);    //Enable double buffering
SDL_SetVideoMode(640, 480, 16, SDL_OPENGL );

       
glViewport(0,0,640,480);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, 640, 480, 0.0f, -1.0f, 1.0f);
       
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_DEPTH_BUFFER_BIT);

SDL_Event event;
        while(1)
        {
                if(SDL_PollEvent(&event))
                {
                        switch (event.type)
                        {
                        case SDL_QUIT:
                                SDL_Quit();
                                exit(0); ////
                                break;
                        }
                }
                // draw
                glClear(GL_COLOR_BUFFER_BIT);
                glLoadIdentity();
                glTranslatef(0,0,0);
                glRectf(0,0,100,100);
                glVertex2f(100,100);
                glEnd();
                SDL_GL_SwapBuffers();
       
       

        }
  return 0;

}



الكود واضح ..

طبعا تستدعي الملف sdl.h من المكان اللي انت وضعته فيه .
انا قمت بانشاء مجلد اسمه sdl ولصقت فيه جميع ملفات sdl الرأسية .. ونسخت هذا المجلد ووضعته في مجلد include الموجود في مسار الفيجوال سي ,,

و تستطيع تطبيق الكود على اكثر من مترجم فالامر بسيط ..( خاصة مترجم Visual cpp 6 تستطيع ترجمت الكود بنفس الطريقة التي شرحتها في الاعلى ) .



اذا اردت المزيد من الخيارات مثل :
المزيد عن الevent مثل :
هل النافذة مفعلة .. هل تم تغيير ابعاد النافذة .. الخ .

فانه بامكانك ذلك ..

وايضا بامكانك تجعل النافذة full screen .

وايضا بامكانك الاستفادة من خدمة تقدمها مكتبة SDL وهي تحميل صور BMP واستخراج الkey Color ,,
بالتالي تستخدمه مع الاكساء في OpenGL .

هذه المكتبة ممتازة و تقدم عدد كبير من الخيارات الاضافية ..

لعلنا نناقشها في القسم العام لاحقا ( ان شاء الله ) .

ملف مرفق  baseSDL_OpenGL.zip (6.31كيلو )