تبليغاتX
OpenGL & Computer graphics - آموزشهای NeHe برای OpenGL درس اول - قسمت اول

با عرض سلام خدمت دوستان :

 

بدون مقدمه درس اول از سلسله دروس NeHe OpenGL Tutorials را با هم شروع میکنیم. فقط امیدوارم که دوستان مطالب پست قبل را به دقت مطالعه کرده باشند.

 

این مقاله طرز برپاکردن یک پنجره OpenGL را به شما آموزش خواهد داد. پنجره ای که میتواند در حالت تمام صفحه "full screen" و یا در اندازه اصلی یک پنجره "Windowed" و یا هر اندازه و رزولوشنی که شما بخواهید و با هر دقت رنگی نمایش داده شود. این کد ( برنامه ای که در این درس مینویسیم ) بسیار انعطاف پذیر بوده و شما میتوانید از آن در کلیه پروژه های OpenGL خود استفاده کنید. تمام کد هایی که من در طی این سلسله دروس استفاده کرده ام ((من یعنی نویسنده این آموزشها آقای جف مولوفی که ملقب به NeHe میباشد وگرنه من که تنها آنها را ترجمه کرده ام )) بر پایه این کد میباشد.من بطریقی این کد را نوشتم که انعطاف پذیر و قدرتمند باشد. این کد اشکال زدایی شده و از همه لحاظ تست شده است. بسیار خوانا بوده و به راحتی قابل اصلاح میباشد.

 

یک نکته مهم : بسیاری از کامپایلر ها ثابت CDS_FULLSCREEN را تعریف نمیکنند. پس اگر شما به خطایی در حین کامپایل برخورد کردید باید که این قطعه کد را به ابتدای برنامه خود اضافه کنید.

#define CDS_FULLSCREEN 4

 

خوب دیگه بریم سر اصل مطلب و برنامه خودمون رو شروع کنیم :

 

این چهار خط که در زیر آمده فایلهای هدر (سر آیند) مربوط به کتابخانه هایی که ما در برنامه مان استفاده میکنیم را به برنامه ضمیمه میکند :

در مرحله بعدی شما نیاز دارید که تمام متغیر هایی را که میخواهید در برنامه استفاده کنید برپا کنید (ایجاد کنید). این برنامه یک پنجره خالی OpenGL میسازد. پس ما فعلا نیازی به تعریف متغیر های زیاد نداریم. این متغیر هایی که ما ایجاد میکنیم بسیار مهم هستند و در برنامه هایی که شما با استفاده از این کد مینویسید استفاده میشوند.

اولین خط از خطوط زیر یک زمینه رندر یا "Rendering Context" را مقدمه چینی (برپا) میکند. هر برنامه OpenGL به یک زمینه رندر پیوند یافته است. یک زمینه رندر "Rendering Context" چیزی است که فراخوانی های OpenGL را به زمینه دستگاه "Device Context" پیوند میدهد. زمینه رندر OpenGL با عنوان hRC تعریف شده است. برای اینکه برنامه شما قادر به ترسیم چیزهایی بر روی پنجره باشد شما نیاز دارید که یک زمینه دستگاه "Device Context" طراحی کنید که این کار در خط دوم انجام شده است. زمینه دستگاه ویندوز با عنوان hDC تعریف شده است.

 

DC پنجره را به GDI (رابط دستگاه گرافیک Graphics Device Interface )مرتبط میسازد و RC به نوبه خود OpenGL را به DC مرتبط میسازد.

در خط سوم متغیر hWnd دستگیره ای را که توسط ویندوز به پنجره ما اختصاص یافته را نگهداری میکند و سر انجام خط چهارم یک رویداد برای برنامه ما میسازد.

اولین خط از خطوط زیر آرایه ای را برپا میکند که ما از آن برای مونیتور کردن ( ردیابی کردن ) کلید های فشرده شده از صفحه کلید استفاده میکنیم. البته راههای بسیاری برای اینکار وجود دارد اما من این راه را انتخاب کرده ام چون اولا قابل اطمینان است و در درجه دوم میتواند به فشرده شدن تعداد بیش از یک کلید در لحظه نیز رسیدگی کند.

متغیر فعال که ما در برنامه مان استفاده کرده ایم برای این است که به برنامه ما بگوید که آیا پنجره برنامه ما به صورت حداقل "Minimized" تبدیل شده است و یا نه. اگر برنامه ما به صورت حداقل "Minimized" در آمده باشد ما میتوانیم کارهایی از قبیل خروج از برنامه و یا متوقف کردن برنامه به صورت موقت را انجام دهیم. من شخصا ترجیح میدهم که در این طور مواقع برنامه را به صورت موقت متوقف کنم. این کار باعث میشود تا زمانی که برنامه به صورت حداقل در آمده در پشت صحنه همچنان اجرا نشود.

متغیر fullscreen هم که کاملا واضح است. اگر برنامه ما در حالت تمام صفحه در حالت اجرا شدن باشد مقدار این متغیر برابر با TRUE است و اگر برنامه در حالت پنجره شده "Windowed" در حالت اجرا باشد مقدار این متغیر برابر FALSE میباشد. بسیار مهم است که این متغیر از نوع سراسری یا همان "global" باشد چون در این صورت تمام پردازه ها ( رویه ها ) میتوانند بفهمند که برنامه در حالت فول اسکرین قرار دارد یا نه.

در گام بعدی ما باید WndProc() را تعریف کنیم. دلیل اینکه ما مجبور به انجام این کار هستیم اینست که تابع CreateGLWindow() یک ارجاع به WinProc() دارد ولی WinProc() بعد از تابع CreateGLWindow() آمده است. در زبان سی اگر ما بخواهیم به یک رویه یا قسمتی از کد دسترسی داشته باشیم که در جایی بعد از قسمتی از کد که در حال حاضر قرار داریم آمده باشد ما مجبوریم که قسمتی از کد را که میخواهیم به آن دسترسی داشته باشیم در بالای برنامه مان اعلام نماییم. بنابر این در خط زیر ما WinProc() را اعلان کردیم پس CreateGLWindow() میتواند به آن مراجعه نماید.

 

 

وظیفه بخش بعدی اینست که صحنه OpenGL را تغییر اندازه بدهد در هر زمانی که پنجره برنامه تغییر اندازه داده شد.(فرض میکنیم که برنامه شما در حالت پنجره ای در حال اجراست و نه در حالت فول اسکرین). اگر هم شما قادر به تغییر اندازه پنجره نباشید (( برای مثال در حالت فول اسکرین باشید )) این روتین حداقل یکبار در ابتدای شروع برنامه اجرا میشود تا نمای پرسپکتیو ما را برپا کند.

خطوط نمونه زیر صفحه را برای نمای پرسپکتیو برپا میکند. بدین معنی که چیزهایی که در فواصل دورتر هستند اندازه کوچکتری داشته باشند. این عمل باعث میشود که صحنه واقعی تر به نظر برسد. پرسپکتیو بر اساس یک نمای 45 درجه از طول و عرض پنجره محاسبه شده است. 0.1f نقطه شروع و 100.0f مقدار پایان برای مقدار عمقی است که ما میتوانیم بر روی صحنه ترسیم کنیم.

 

ادامه دارد.

+ نوشته شده توسط ( ساسان و محمد ) در دوشنبه دوازدهم تیر 1385 و ساعت |
Image and video hosting by TinyPic