شروع OpenGL
قبل از شروع یادگیری ابتدا باید مشخص کنیم که OpenGL چیست. در واقع OpenGL یک API (رابط برنامه نویسی کاربردی) است که تعداد زیادی از توابع را در اختیار ما قرار می دهد تا با استفاده از آن بتوانیم گرافیک ها و تصاویر را دستکاری کنیم.
معمولا سازندگان کارت های گرافیک، کتابخانه های OpenGL را توسعه می دهند. هر کارت گرافیکی که خریداری می کنید، نسخه های خاصی از OpenGL را که برای آن سری از کارت گرافیک طراحی شده است را پشتیبانی می کند. بنابراین هرگاه OpenGL رفتارهای عجیب و غریبی را نشان دهد، احتمالا ناشی از خطاهایی است که سازندگان کارت گرافیک (توسعه دهندگان کتابخانه های OpenGL) داشته اند.
هز زمان که مشکلی در اجرای کارت گرافیک وجود داشته باشد، معمولا سازندگان آن با ارائه به روز رسانی مشکل را حل می کنند. این به روز رسانی شامل جدیدترین نسخه های OpenGL می باشد که کارت گرافیک شما پشتیبانی می کند. یکی از دلایلی که همیشه توصیه می شود درایو کارت گرافیک خود را به روز رسانی کنید، همین موضوع است.
Core-profile در مقابل Immediate mode
در گذشته، استفاده از OpenGL به صورت توسعه در حالت immediate mode بود که یک روش آن برای استفاده از گرافیک به شمار می رفت. اکثر قابلیت های OpenGL در کتابخانه پنهان شده بودند و توسعه دهندگان آزادی زیادی در چگونگی انجام محاسبات نداشتند. در نهایت توسعه دهندگان به انعطاف پذیری بیشتر نیاز پیاده کردند و در طول زمان ویژگی های OpenGL انعطاف پذیر تر شد. Immediate mode برای درک و استفاده بسیار آسان می باشد، اما بسیار ناکارآمد است. به همین دلیل توسعه دهندگان به سمت Core-profile مهاجرات کردند.
استفاده از Core-Profile توسعه دهنده را مجبور به استفاده از شیوه های مدرن می کند. زمانی که از یک تابع ضعیف OpenGL استفاده می کنیم، OpenGL یک خطا می دهد و ادامه کار را متوقف می سازد. رویکرد Core-Profile انعطاف پذیری و کارآمدی بالایی دارد اما متاسفانه برای یادگیری دشوار است. رویکرد مدرن مستلزم این است که برنامه نویس، واقعا برنامه نویسی OpenGL و گرافیک را درک کند. بنابر موارد گفته شده، در این آموزش ما از Core-Profile OpenGL 3.3 استفاده خواهیم کرد.
امروزه نسخه های جدیدتری از OpenGL منتشر شده است و ممکن است بپرسید: چرا از نسخه ۳٫۳ برای آموزش استفاده می کنیم؟ پاسخ به این سوال نسبتا ساده است. نسخه ۳٫۳، نسخه پایه تمام نسخه های جدیدتر OpenGL است ویژگی های جدید بدون تغییر در مکانیزم نسخه اصلی به آن اضافه شده اند. نسخه های جدیدتر فقط راه های کارآمد و مفیدتری را برای انجام وظایف مشابه معرفی می کنند. از این رو شما با یادگیری OpenGL اصلی، به راحتی می توانید نسخه های جدیدتر آن را نیز یاد بگیرید.
افزونه ها (Extensions)
یکی از ویژگی های عالی OpenGL پشتیبانی آن از افزونه ها می باشد. شرکت های گرافیک تکنیک جدید یا یک بهینه سازی بزرگ برای خود را به صورت Extensions ارائه می کنند. اگر سخت افزاری که برنامه گرافیکی بر روی آن اجرا می شود، از افزونه های گرافیکی پشتیبانی کند، توسعه دهندگان می توانند با استفاده از آن ها برنامه های کارآمدتری ایجاد کنند.
توسعه دهندگان باید بدانند که کدام افزونه ها در دسترس می باشند. این موضوع به آن ها کمک می کند تا بتوانند کارها را بهتر و کارآمدتر انجام دهند. مثال زیر بررسی می کند که آیا یک افزونه در دسترس است یا خیر:
1 2 3 4 5 6 7 8 | if(GL_ARB_extension_name) { // Do cool new and modern stuff supported by hardware } else { // Extension not supported: do it the old way } |
اگر از نسخه OpenGL 3.3 استفاده کنید، به ندرت پیش می آید که بخواهید از افزونه ها استفاده کنید، اما هر کجا که لازم باشد دستورالعمل های مناسب ارائه می شود.
ماشین حالت (State Machine)
OpenGL به خودی خود یک ماشین حالت بزرگ است: مجموعه ای از متغیرهایی که چگونگی کار کرد OpenGL را تعریف می کنند. حالت OpenGL معمولا به عنوان OpenGL Context نامیده می شود. هنگام استفاده از OpenGL، حالت خود را با تنظیم برخی از گزینه، دستکاری برخی بافرها و غیره تغییر می دهیم.
هنگامی که با OpenGL کار می کنیم، چندین تابع تغییر حالت را در اختیار داریم که زمینه را تغییر می دهند و چندین تابع دیگر که بر اساس حالت فعلی OpenGL برخی از عملیات ها را انجام می دهند.
اشیاء (Objects)
کتابخانه های OpenGL با استفاده از زبان برنامه نویسی C نوشته شده اند و می توانند در زبان های دیگر مشتق شوند، اما در هسته آن یک کتابخانه C باقی می ماند. از آن جا که بسیاری از ساختارهای زبان C به خوبی به زبان های سطح بالا ترجمه نشده است، OpenGL با چندین تفاوت طراحی شده است که یکی از آن ها اشیاء (Objects) در OpenGL می باشد.
یک شیء در OpenGL مجموعه ای از گزینه هایی می باشد که یک زیر مجموعه از حالت OpenGL را نشان می دهند. به عنوان مثال با می توانیم یک شیء داشته باشیم که تنظیمات پنجره کشیده شده را نشان دهد. همچنین می توانیم اندازه، رنگ و غیره را نیز تنظیم کنیم. می توان یک شیء را مانند یک ساختار (struct) در زبان C تصور کرد:
1 2 3 4 5 | struct object_name { float option1; int option2; char[] name; }; |
به طور کلی نحوه استفاده از اشیاء، چیزی شبیه به این است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // The State of OpenGL struct OpenGL_Context { ... object* object_Window_Target; ... }; // create object unsigned int objectId = 0; glGenObject(1, &objectId); // bind object to context glBindObject(GL_WINDOW_TARGET, objectId); // set options of object currently bound to GL_WINDOW_TARGET glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800); glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600); // set context target back to default glBindObject(GL_WINDOW_TARGET, 0); |
این تکه کد، یک جریان کاری است که اغلب در هنگام کار با OpenGL مشاهده خواهید کرد. ما در ابتدا یک شیء ایجاد و یک ارجاع به آن را به عنوان شناسه (objectId) ذخیره می کنیم (اطلاعات شیء واقعی در پشت صحنه ذخیره می شود). سپس شیء را به محل هدف متصل می کنیم (در مثال بالا محل هدف به عنوان GL_WINDOW_TARGET تعریف شده است). بعد از آن Option های مربوط به GL_WINDOW_TARGET را تنظیم می کنیم و در نهایت با تنظیم پارامتر objectId هدف بر روی صفر، آن را به حالت پیشفرض بر میگردانیم.
خوب دنباله مطلب کجاست ؟
ادامه آموزش رو می تونید از قسمت دسته بندی شده که سمت راست صفحه وجود داره، پیگیری کنید.