مقالات آموزش OpenGL

آبجی

عضو جدید
کاربر ممتاز





مقالات آموزش OpenGL قسمت اول

OpenGL چیست :



OpenGL دقیقا به عنوان یک "رابط نرم افزاری برای سخت افزار گرافیکی" تعریف شده است. OpenGL در ماهیت خود یک کتابخانه مدل سازی و گرافیک سه بعدی میباشد که بسیار سریع و قابل انتقال است. با استفاده از OpenGL شما میتوانید تصاویر سه بعدی زیبا و جذابی طراحی کنید. بزرگترین فایده استفاده از OpenGL اینست که فوق العاده از یک ردیاب نور (ray tracer ) سریعتر است. OpenGL از الگوریتمهایی استفاده میکند که توسط شرکت Silicon Graphics توسعه یافته و بهینه شده است.

SGI یک رهبر تائید شده در دنیای گرافیک کامپیوتری و انیمیشن میباشد.



OpenGL یک زبان برنامه نویسی مانند c یا c++ نیست. OpenGL بیشتر شبیه کتابخانه زمان اجرای C می باشدکه یک سری توابع از پیش بسته بندی شده را تدارک دیده. در عمل چیزی به نام برنامه OpenGL وجود ندارد. وقتی ما میگوییم این یک برنامه OpenGL است یعنی در ساختار این برنامه از OpenGL به عنوان API گرافیکی اش استفاده کرده است همانطور که ما از توابع APIویندوز استفاده میکنیم تا بتوانیم به فایلها و امکانات شبکه ای و غیره ویندوز دسترسی پیدا کنیم. همین طور هم ما از توابع OpenGL استفاده میکنیم تا بتوانیم گرافیک سه بعدی بلادرنگ طراحی کنیم.



IRIS GL در ابتدا یک کتابخانه دوبعدی بود که پیشرفت کرد و به OpenGL تبدیل شد. در حقیقت OpenGL نتیجه تلاشی بود که شرکت SGI برای اصلاح و بهبود IRIS GL کرد.



OpenGL استاندارد به سازندگان شخصی سخت افزار گرافیکی این اجازه را میدهد که قابلیت های افزودنی خودشان را با عنوان Extension تهیه کنند که ممکن است بعضی از محدودیت های توابع OpenGL را کم کند یا راحت تر کند و یا اینکه قابلیت های جدیدی را به آن بیفزاید. Extension ها از توابع و ثابت های جدیدی ساخته شده اند که قابلیت های جدیدی را به OpenGL استاندارد می افزایند.

هر سازنده سخت افزار گرافیکی یک اختصار الفبایی مخصوص به خود برای نامگذاری Extension های خودش دارد. برای مثال شرکت NVIDIA از حروف اختصاری NV برای نامگذاری Extension هایی که درست میکنند استفاده میکنند.



OpenGL 2.0 توسط شرکت 3D Labs ایجاد شد که نگران راکد ماندن و نداشتن یک مدیریت قوی برای

OpenGL بود. . این شرکت قابلیت های جدیدی را به OpenGL اضافه کرد که پر اهمییت ترین آنها زبان سایه زنی GLSL بود.

این قابلیت برنامه نویسان را قادر میساخت که خطوط لوله تکه و راس تابع ثابت OpenGL را با سایه زن های نوشته شده در زبانی شبیه به C تعویض کنند.​
 

آبجی

عضو جدید
کاربر ممتاز
مقالات آموزش OpenGL قسمت دوم

مقالات آموزش OpenGL قسمت دوم

OpenGL چگونه کار میکند :



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

بعلاوه OpenGL نورپردازی و نگاشت بافت و آمیختگی و شفاف نمایی و انیمیشن و بسیاری دیگر از افکت های ویژه سه بعدی و قابلیت های زیاد دیگری را پشتیبانی میکند.



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



پیاده سازی عمومی :

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



تصویر 1-2 مکان نمونه ای را نشان میدهد که OpenGL و یک پیاده سازی عمومی اشغال کرده اند هنگامی که یک برنامه در حال اجراست. برنامه نمونه توابع زیادی را فراخوانی کرده است. بعضی از توابعی که کاربر تولید کرده و بعضی ها که توسط سیستم عامل مهیا شده اند یا متعلق به کتابخانه زمان اجرای زبان برنامه نویسی هستند. زمانی که برنامه های ویندوز میخواهند که چیزی را بر روی صفحه خروجی رسم کنند معمولا یکی از توابع API ویندوز را که (رابط دستگاه گرافیکی) نامیده میشود صدا میزنند. GDI شامل متد هایی است که به شما اجازه نوشتن متن و ترسیم اشکال دو بعدی ساده و غیره را میدهد



معمولا سازندگان کارت های گرافیکی یک درایور سخت افزاری با رابط های GDI تهیه میکنند که خروجی را بر روی مانیتور رسم کند. یک پیاده سازی نرم افزاری از OpenGL گرافیک های تقاضا شده توسط یک برنامه را میگیرد و از آن گرافیک سه بعدی یک تصویر دو بعدی رنگی ایجاد میکند. سپس این تصویر را به GDI میفرستد تا بر روی مانیتور نمایش دهد. در بقیه سیستم های عامل نیز وضع به همین منوال است اما شما GDI را با سرویس نمایش محلی سیستم عامل خود تعویض میکنید.



OpenGL یک جفت پیاده سازی نرم افزاری مشترک دارد. یکی پیاده سازی نرم افزاری مایکروسافت است که با هر ورژن از ویندوز مانند NT 3.5 و بالاتر و Win95 و 2000 و XP ارایه میشود.

SGI یک پیاده سازی نرم افزاری از OpenGL را برای ویندوز طراحی کرد که پیاده سازی مایکروسافت را از دور خارج میکند. این پیاده سازی دیگر به طور رسمی پشتیبانی نمیشود اما هنوز به مقدار زیادی توسط توسعه دهندگان استفاده میشود. که در انجمن های اوپن سورس از مقبولیت و پشتیبانی خوبی برخوردار است. Mesa 3D یک OpenGL مجوز دار نیست. بنابر این بیش از این که یک پیاده سازی رسمی باشد مانند یک همکار برای OpenGL است.



پیاده سازی سخت افزاری :

یک پیاده سازی سخت افزاری از OpenGL شکل یک درایور کارت گرافیکی را دارد. شکل 2-2 ارتباطش با برنامه مانند شکل 1-۲ است. توجه کنید که فراخوانی های توابع OpenGL به درایور سخت افزار پاس داده میشوند. این درایور خروجی خود را به GDI ویندوز برای نمایش پاس نمیدهد. رابط خودش مستقیما با سخت افزار نمایش گرافیکی رابطه دارد.





یک پیاده سازی سخت افزاری به عنوان یک پیاده سازی تسریع شده شناخته میشود. چون گرافیک سه بعدی با کمک سخت افزار بسیار بهتر و سریعتر از یک پیاده سازی صرفا نرم افزاری عمل میکند. چیزی که در تصویر 2-2 نشان داده نشده اینست که بخشی از قابلیتهای OpenGL هنوز به صورت نرم افزاری به صورت بخشی از درایور ایجاد میشود و بقیه قابلیتها و خصوصیات میتواند مستقیما به سخت افزار پاس داده شوند.
 

آبجی

عضو جدید
کاربر ممتاز
The Pipeline :



کلمه pipeline جهت شرح دادن پروسه ای که میتواند دو مرحله جداگانه یا بیشتر را در بر بگیرد استفاده میشود. تصویر 3-2 یک pipeline خلاصه شده OpenGL را نشان میدهد.



به عنوان برنامه ای که توابع API مربوط به OpenGL را فراخوانی میکند دستورات در محلی بنام بافر دستور یا Command Buffer ذخیره میشود. این بافر بالاخره با اطلاعات راس و تکسچر و غیره پر میشود. وقتی این بافر تا آخرین حد پر شود توسط برنامه یا توسط طراحی درایور دستورات و اطلاعات به مرحله بعدی در پروسه Pipeline پاس داده میشوند





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



هنگامی که این مرحله به پایان رسید اطلاعات به بخش بعدی Pipeline یعنی Rasterization خورانده میشود. Rasterizer در عمل یک تصویر رنگی از اطلاعات هندسی و رنگها و اطلاعات تکسچر میسازد. این تصویر سپس به بافر فریم ّFrame Buffer منتقل میشود. بافر فریم قسمتی از حافظه دستگاه نمایش گرافیکی (کارت گرافیک ) میباشد. این بدین معنی است که تصویر در صفحه نمایش داده شده است. در یک سطح بالا این نمودار صحیح میباشد اما در یک سطح پایین تر قسمتهای زیاد دیگری نیز در این پروسه وجود دارد. همچنین استثنائاتی هم وجود دارد. همانطور که در نمودار هم پیداست بعضی از اطلاعات از مرحله T&L یا همان Transform & Lighting عبور نمیکنند.



در گذشته شتاب دهنده های سخت افزاری OpenGL چیزی جز fast Rasterizer نبودند. آنها تنها بخش Rasterization را شتاب میبخشیدند و پردازشگر سیستم میزبان مرحله T&L را به صورت نرم افزاری و به عنوان بخشی از pipeline انجام میداد. شتاب دهنده های با کیفیت تر (گرانتر) خودشان قسمت T&L را انجام میدادند. به این ترتیب بیشتر مراحل Pipeline در سخت افزار گرافیکی انجام میشد و گرافیک بیشتری بدست می آمد.

امروزه هر کارت ارزان قیمتی مرحله T&L را به صورت سخت افزاری انجام میدهند. خوبی این چیز در اینست که مدلهای با کیفیت بالاتر و تصاویر گرافیکی پیچیده تری در رندر گرافیکی بلادرنگ امکان پذیر میشود.
 

آبجی

عضو جدید
کاربر ممتاز
مقالات آموزش OpenGL قسمت سوم

مقالات آموزش OpenGL قسمت سوم

OpenGL یک API است نه یک زبان برنامه نویسی :



OpenGL یک API است نه یک زبان برنامه نویسی. OpenGL یک رابط برنامه نویسی است. هر زمان که ما میگوییم که این برنامه بر اساس OpenGL است یا OpenGL Based یا این که این یک برنامه OpenGL است منظورمان اینست که این برنامه در یک زبان برنامه نویسی مانند C و یا C++ و یا Java نوشته شده که تعداد یک و یا بیشتر از توابع کتابخانه OpenGL را فراخوانی میکند.



ما نمیگوییم که برنامه تنها از OpenGL برای طراحی استفاده میکند ممکن است که ما از بهترین خصوصیات دو بسته مختلف گرافیکی استفاده کنیم. ممکن است ما از OpenGL برای انجام تعدادی از وظایف ویژه و از GDI برای کارهای دیگری استفاده کنیم. تنها استثنا در این مورد GLSL یعنی همان زبان برنامه نویسی سایه ها در OpenGL میباشد که بعدها در آموزشهایمان تدریس خواهد شد.



به عنوان یک API کتابخانه OpenGL از شیوه صدا زدن تابع در C یا C++ پیروی میکند. آموزشهای ما بر مبنای زبان C میباشد. اما C++ نیز میتواند به سادگی به توابع API مانند C دسترسی پیدا کند. در حقیقت اگر شما با C++ آشنا هستید هیچ گونه مشکلی با آموزشهای ما نخواهید داشت. OpenGL در کلیه زبانهای برنامه نویسی از قبیل C و C++ و VB و C# و Delphi و Java و ... قابل استفاده است.



کتابخانه ها و فایلهای سر آیند :

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

در آخر همین مقاله توضیح میدهم که چرا پیاده سازی مایکروسافت تنها بدرد لای جرز دیوار میخورد و ما باید برای استفاده از قابلیت های OpenGL 2 در ویندوز چکار کنیم. البته این نظر شخصی من یعنی ساسان میباشد.

پیاده سازی مایکروسافت در فایل OpenGL32.dll قرار دارد که یک کتابخانه پویا میباشد و در پوشه c:\windows قرار دارد. در بیشتر پلتفرم ها کتابخانه OpenGL همرا با یک کتابخانه سودمند کمکی ارائه میشود که به نام GLU معروف است.که در ویندوز با نام Glu32.dll ارائه شده و در آدرس c:\windows قرار دارد. این کتابخانه سودمند مجموعه ای از توابع است که وظایف مشترکی را انجام میدهند مانند محاسبات ماتریکس های ویژه و همچنین پشتیبانی از کلیه از انواع مختلی از منحنی ها و سطوح پیچیده را مهیا میکنند.

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

آبجی

عضو جدید
کاربر ممتاز
نمونه های اولیه برای کلیه توابع OpenGL و انواع داده و ماکروها در فایل gl.h قرار دارد. محیط برنامه نویسی مایکروسافت این فایل را دارد. همچنین نمونه های اولیه توابع کتابخانه کمکی سودمند OpenGL در فایل glu.h قرار دارد. این فایلها معمولا در مسیر /include محیط برنامه نویسی شما قرار دارد. برای مثال قطعه کد زیر طریقه استفاده از OpenGL را در یک برنامه نمونه ویندوز نمایش میدهد.



#include <windows>

#include <GL>

#include <GL>



و اما حالا میرسیم به توضیحاتی که قرار بود من در مورد پیاده سازی مایکروسافت انحصارطلب پدر سوخته از OpenGL بدهم.

در محیط برنامه نویسی ویژوال استدیو اگر خوب به فایلهای gl.h و glu.h دقت کنید متوجه میشوید که این فایلها نهایتا تا OpenGL 1.1 را ساپورت میکند و همینطور فایل opengl32.dll که آن نیز یک پیاده سازی بر مبنای OpenGL 1.1 میباشد. اما این به نظر شما یعنی چه. این یعنی مایکروسافت انحصار طلب چون طاقت دیدن حریف را ندارد با این کار سعی کرده پشتیبانی خود را از OpenGL محدود کند تا توسعه دهندگان به استفاده از دایرکت ایکس تشویق شوند. اما کور خوانده است. این دلیل نمیشود که چون مایکروسافت در محیط برنامه نویسی اش از OpenGL 2 پشتیبانی نمیکند ما نتوانیم از OpenGL 2 استفاده کنیم. حالا چاره چیست. شرکت هایی مانند nVIDIA و ATI هر کدام OpenGL 2 را درقالب یک فایل اکستنشن ایجاد کرده اند که شما با اضافه کرد و الحاق آن به ابتدای برنامه خود میتوانید از قابلیتها و توابع OpenGL 2 استفاده کنید البته مشروط بر این که کارت گرافیک شما از OpenGL به صورت سخت افزاری پشتیبانی نماید که دیگر امروزه تقریبا همه کارتها این ویژگی را دارند.

مثلا من در کامپیوترم یک کارت Geforce 5200 دارم که تا OpenGL 1.5 را ساپورت میکند. خوب من حالا با اضافه کردن فایل glext.h به ابتدای برنامه ام میتوانم از قابلیتهای OpenGL 1.5 استفاده کنم.

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



البته یک راه بهتر هم وجود دارد و آن استفاده از ابزارهایی مانند G LEEو یا GLEW میباشد. این ابزار ها شامل کلیه توابع و قابلیتهای OpenGL 2 به همراه تعداد زیادی نزدیک به 340 اکستنشن از شرکت های مختلف میباشد که طریقه استفاده از آنها در سایت خودشان نوشته شده است و بسیار آسان میباشد. و این یعنی مشت محکمی بر دهن مایکروسافت انحصار طلب



http://elf-stone.com/glee.php

این آدرس سایتی است که شما میتوانید ابزار GLEE را به حجم 354 کیلو بایت از آن دانلود کنید این بسته شامل چندین فایل به نامهای glee.h و wglee.h و کتابخانه های مربوطه میباشد که شما با ضمیمه کرده آنها به ابتدای برنامه خود میتوانید از کلیه توابع و قابلیتهای OpenGL 2.0 استاندارد به اضافه 340 عدد اکستنشن مختلف از nVIDIA و ATI و ARB دسترسی داشته باشید.



یک ابزار مفید دیگر که این کار را برای شما انجام دهد GLEW میباشد که روش استفاده از آن درست مانند GLEE میباشد و البته در سایت خودش هم آموزش داده است.این هم آدرس سایت :

http://glew.sourceforge.net



و اما دوستان میخواهم یک نصیحت دوستانه به شما بکنم اگر دوست دارید به جای ویژوال استدیو دات نت از ابزارهای دیگری مانند CodeBlock و یا Dev-cpp برای انجام آموزشهایمان استفاده کنید البته این به هیچ وجه الزامی نیست. اما این محیط های برنامه نویسی علاوه به ساپورت نسخه های جدید OpenGL به صورت فایل glext.h حاوی مثالهای زیادی از OpenGL هستند.من خودم بشخصه برای تمام کارهای برنامه نویسی از Dev-cpp IDE که به همراه کامپایلر Mingw و به صورت رایگان در اختیار همه قرار داده شده استفاده میکنم. Codeblock هم به همین صورت است رایگان است و همراه با کامپایلر Mingw ارائه میشود که نسخه تحت ویندوز gcc میباشد.



برای دانلود آنها میتوانید به این سایتها مراجعه کنید :

http://www.codeblocks.org

http://www.bloodshed.net
 

آبجی

عضو جدید
کاربر ممتاز
مقالات آموزش OpenGL قسمت چهارم

مقالات آموزش OpenGL قسمت چهارم

استقلال از وابستگی به هر گونه پلتفرم خاص :



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

اگر OpenGL دستوری برای باز کردن یک پنجره داشت آیا شما از آن استفاده میکردید یا شما دوست داشتید تا از توابع توکار API سیستم عامل خود کمک بگیرید.

موضوع دیگر در مورد پلتفرم روش رسیدگی به کیبورد و رخدادهای ورودی ماوس تحت سیستم عامل های مختلف است. اگر تمام محیط ها شیوه رسیدگی مشابهی برای این رخدادها داشتند ما تنها یک محیط داشتیم تا در باره اش فکر کنیم و احتیاجی به یک API باز نداشتیم. بهر حال موضوع ما این نیست و ممکن است این در طول عمرمان رخ ندهد. پس ارزش مستقل از پلتفرم بودن OpenGL در همین است که تابعی برای سیستم عامل و GUI ندارد.



استفاده از GLUT :

در آغاز تنها کتابخانه AUX یعنی کتابخانه کمکی OpenGL که مخفف OpenGL Auxiliary Library میباشد. این کتابخانه به منظور تسهیل یادگیری و نوشتن برنامه های OpenGL طراحی شده بود. بدون اینکه برنامه نویس با جزئیات محیطی که در آن برنامه مینویسد گیج بشود حالا چه سیستم عامل یونیکس چه لینوکس یا مکینتاش و یا ویندوز. شما هنگام استفاده از AUX کد نهایی را نمی نوشتید. آن به عنوان یک اسکلت مقدماتی برای تست ایده های شما بود. نبودن خصوصیات مقدماتی GUI در این کتابخانه استفاده از آن را برای ساخت برنامه های حرفه ای محدود میکند.

چندین سال پیش بیشتر برنامه های نمونه OpenGL روی وب با استفاده از کتابخانه AUX نوشته شده بودند. پیاده سازی تحت ویندوز این کتابخانه پر از ایراد بود و باعث میشد برنامه بارها Crash کند. نبودن هیچ خصوصیت GUI یکی از دلایلی بود که آن را در عصری که همه برنامه ها بر اساس GUI طراحی میشدند بی مصرف ساخت.
 

آبجی

عضو جدید
کاربر ممتاز
در نهایت کتابخانه AUX با کتابخانه GLUT تعویض شد. GLUT کتابخانه ای است مستقل از پلتفرم برای طراحی برنامه های نمونه و نمایشی. GLUT مخفف OpenGL Utility Toolkit میباشد.(لطفا با کتابخانه GLU اشتباه نگیرید). مارک کیلگارد زمانی که در شرکت SGI کار میکرد GLUT را به منظور از دور خارج کردن AUX با یک کتابخانه بهتر و لایقتر نوشت. کتابخانه GLUT رایگان میباشد. شما میتوانید آخرین ورژن آن را از این آدرس دانلود کنید.



http://www.xmission.com/~nate/glut.html



http://www.sun.com/software/graphics/op ... wnload.xml



در موقع دانلود مواظب باشید که نگارش مخصوص ویندوز را دانلود نمایید. ما در بیشتر آموزشهایی که من از کتاب OpenGL SuperBible 3rd Edition ترجمه کرده ام از GLUT استفاده میکنیم.

این کار برای ما دو هدف را بر آورده میکند اول اینکه افراد بیشتری میتوانند از آموزشهای ما استفاده کنند و نه فقط برنامه نویسان ویندوز. با یک تلاش مختصر کاربران سیستم های لینوکس و مکینتاش میتوانند GLUT را در محیط برنامه نویسی شان آماده و تنظیم کنند و با ما آموزشهای این وبلاگ را دنبال کنند. اما دلیل دومی که ما از کتابخانه GLUT استفاده میکنیم اینست که استفاده از این کتابخانه هرگونه نیاز به دانستن برنامه نویسی GUI تحت پلتفرم خاص را از بین میبرد و ما میتوانیم همه حواسمان را به قابلیتها و یادگیری OpenGL معطوف کنیم.

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

آبجی

عضو جدید
کاربر ممتاز
مقالات آموزش OpenGL قسمت پنجم

مقالات آموزش OpenGL قسمت پنجم

مشخصات API :



OpenGL توسط عده ای از مردم باهوش که تجربه زیادی در طراحی API های گرافیکی داشتند ایجاد شد. آنها قواعدی برای نامگذاری توابع و شیوه اعلان متغیر تعیین کردند. این API برای سازندگان سخت افزار گرافیکی به راحتی قابل توسعه است و به همین دلیل OpenGL سعی میکند از هرگونه سیاست جداگانه ای احتراز کند.



انواع داده در OpenGL :



برای اینکه انتقال کدهای نوشته شده در OpenGL به راحتی از یک پلتفرم به پلتفرم دیگر قابل انتقال باشند OpenGL انواع داده مخصوص به خودش را تعریف کرده است. هر محیط برنامه نویسی یا کامپایلری بهر حال قواعد خاصی برای اندازه و نوع حافظه متغیر های مختلف سی "C" دارد. اما با استفاده از انواع داده های OpenGL یعنی OpenGL Data Types شما میتوانید کد خودتان را در برابر این نوع تغییرات عایق کاری کنید.

جدول 1-2 انواع داده OpenGL را لیست کرده است و همچنین انواع داده متناظر آنها در C تحت محیط ویندوز 32 بیتی را نشان داده است.



تمام انواع داده با یک GL شروع میشوند برای ایمکه مشخص باشد از انواع داده OpenGL میباشد و خیلی از آنها از انواع متناظرشان در زبان C منتج شده اند. مانند float , int , short , byte , … .بعضی در ابتدایشان یک حرف u دارند که بیانگر اینست که از نوع بدون علامت "unsigned" میباشد. مانند ubyte که نماینده unsigned byte است.

برای بعضی از مصارف روشن ترین و مشخص ترین نام تعیین شده است مانند نوع size که مشخص کننده مقدار طول یا عمق میباشد. بطور مثال GLsizei یکی از توابع OpenGL است که نشان دهنده این است که این تابع یک متغیر از نوع صحیح را به عنوان آرگومان میگیرد.
 

آبجی

عضو جدید
کاربر ممتاز

نقش Clamp یک تذکر جزیی است که نشان دهد مقدار باید در محدوده 0.0 – 1.0 باشد. متغیر های GLboolean بدین منظور استفاده میشوند تا مقادیر صحیح یا غلط را نشان دهند.

اشاره گرها و آرایه هاهیچگونه معادل خاصی در OpenGL ندارند. یک آرایه از ده عنصر GLshort بطور ساده به این صورت تعریف میشود :

GLshort shorts[10]; // this way[/align]


و آرایه ای از ده اشاره گر به متغیر های GLdouble بدین صورت تعریف میشود :

[align=left]GLdouble *doubles[10]; //this way[/align]


بعضی از انواع شی اشاره گر دیگر برای NURBS و چهاگوش ها استفاده میشوند که به توضیحات بیشتری احتیاج دارند و در مقالات بعدی پوشش داده خواهند شد.



قواعد نامگذاری توابع در OpenGL :



بسیاری از توابع OpenGL از یک قرارداد تبعیت میکنند تا به شما بفهمانند این تابع از کدام کتابخانه میباشد و در بعضی مواقع اینکه این توابع چه تعداد و چه نوعی از داده ها را به عنوان آرگومان میپذیرد. تمام توابع ریشه ای دارند که دستور متناظر OpenGL آنها را نشان میدهد. برای مثال تابع glColor3f ریشه اش color است و پیشوند gl نشان دهنده کتابخانه gl میباشد. پسوند 3f نشان دهنده این است که این تابع سه عدد آرگومان از نوع ممیز شناور (floating – point) میگیرد. تمام توابع OpenGL قالب زیر را دارند :



<Library><Root><Optional><Optional>

تصویر 2-4 قسمتهای سازنده یک تابع را در openGL نشان میدهد. این تابع نمونه با پسوند 3f سه عدد
آرگومان ممیز شناور میگیرد. نوع دیگر این تابع glColor3i سه عدد صحیح را به عنوان آرگومان میپذیرد. و
نوع glColor3d سه عدد از نوع double را به عنوان آرگومان میگیرد و همینطور الی آخر.




این شیوه اضافه کردن تعداد و نوع آرگومانها به انتهای توابع OpenGL به خاطر آوردن لیست آرگومانهای تابع را آسانتر میکند. بعضی از نسخه های تابع glColor چهار آرگومان میگیرد که آرگومان چهارم مربوط به تعیین مولفه آلفا (شفافیت) می باشد. بسیاری از کامپایلر های C/C++ که برای محیط windows ساخته شده اند اینگونه تصور میکنند که هر لیترال ممیز شناور از نوع double است مگر آنکه بطور صریح توسط مکانیسم پسوند به کامپایلر اعلام شود. هنگامی که از لیترال ها (همان حروف اختصاری) برای اعلان آرگومان ممیز شناور استفاده میکنید اگر شما مشخص نکنید که این آرگومانها از نوع float هستند و نه از نوع double کامپایلر در زمان کامپایل یک اخطار میفرستد چون کشف کرده که شما دارید یک متغیر از نوع double را به تابع ارسال میکنید در صورتی که تابع به گونه ای تعریف شده که فقط انواع float را بپذیرد. در نتیجه ممکن است دقت کار از میان برود. موقعی که این اخطار ها به حد زیادی برسد میتواند حتی عمل شناسایی خطاهای نحوی در طول برنامه را مشکل سازد. البته شما میتوانید این اخطار ها را با خاموش کردن قسمت ارسال اخطار کامپایلر خود از بین ببرید اما من شدیدا توصیه میکنم که سعی کنید کدتان را اصلاح کنید تا تمیز و قابل انتقال بماند. پس تک تک اخطارها را با درست کردن شان از بین ببرید. به علاوه ممکن است شما وسوسه بشوید که از توابعی استفاده کنید که آرگومانهایی از نوع ممیز شناور با دقت مضاعف را میپذیرند (double-precision floating-point) به جای float یا double .البته OpenGL بطور ذاتی از نوع float استفاده میکند و در نهایت انواع دیگر را به نوع ممیز شناور با دقت معمولی تبدیل میکند زیرا هر متغیر از نوع double دو برابر متغیری از نوع float حافظه مصرف میکند و در مقادیر بالا اینکار OpenGL باعث افزایش سرعت و کارایی برنامه میشود.
 

آبجی

عضو جدید
کاربر ممتاز
مقالات آموزش OpenGL قسمت ششم

مقالات آموزش OpenGL قسمت ششم

OpenGL یک ماشین حالت است :



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



برای روشن کردن این متغیر های حالت شما باید از تابع نمونه زیر کمک بگیرید :



void glEnable(GLenum capability); // this way



و برای خاموش کردن از تابع زیر استفاده میکنید :



void glDisable(GLenum capability); // this way
اینها شکل کلی این توابع بود. اما در مورد نورپردازی برای مثال شما میتوانید حالت نورپردازی را با استفاده از این حالت روشن (فعال) کنید :

glEnable(GL_LIGHTING); // this way
و با کمک این تابع آن را خاموش (غیر فعال) میکنید :

glDisable(GL_LIGHTING); // this way
برای اینکه امتحان کنید که یک متغیر حالت فعال است یا نه OpenGL یک مکانیسم راحت را تدارک دیده است
:Glboolean glIsEnabled(GLenum capability); // this way
 

آبجی

عضو جدید
کاربر ممتاز
البته همانطور که قبلا هم گفتم در نهایت تمام متغیر های حالت یا روشن هستند و یا خاموشند. بسیاری از این توابع میتوانند این متغیر های حالت را ارزش دهی کنند تا وقتی که آنها عوض شوند.شما میتوانید در هر لحظه ای که بخواهید ارزش حالت ها را چک کنید. یک مجموعه از توابع تحقیق کننده "query functions" به شما اجازه میدهند تا در هر لحظه که بخواهید ارزش هرکدام از متغیر های بولی یا صحیح یا ممیز شناور و یا ممیز شناور با دقت مضاعف را بفهمید. این چهار تابع بدین صورت نمونه سازی شده اند :

void glGetBooleanv(GLenum pname, GLboolean *params); // this way

void glGetDoublev(GLenum pname, GLdouble *params); // this way

void glGetFloatv(GLenum pname, GLfloat *params); // this way

void glGetIntegerv(GLenum pname, GLint *params); // this way

هر تابع یک ارزش واحد و یکتا و یا آرایه ای کامل از ارزشها را برمیگرداند. نگهداری نتایج در آدرسهایی که شما تدارک دیده اید. شما باید ممنون سادگی و قدرت ماشین حالت OpenGL باشید. ذخیره کردن و اعاده (پس دادن یا برگرداندن) حالت ها : OpenGL همچنین یک مکانیزم راحت و مناسب برای ذخیره کردن محدوده کاملی از ارزشهای حالت و بازگرداندن مجدد آنها دارد. "پشته" یا "stack" یک ساختمان داده ای مناسب است که اجازه میدهد داده ها به پشته وارد شوند (ذخیره کردن) و بعد از پشته بیرون بپرند تا بازیابی شوند. آیتم هایی که قبلا در پشته هل داده شده بودند (ذخیره شده بودند) با دستوری متضاد بازیافت میشوند. ما این را یک ساختمان داده ای بنام "بترتیب عکس ورود" و یا "Last in First Out" مینامیم. دقیقا مثل این میماند که ما بگوییم "هی لطفا این را ذخیره کن" و یا "push it on the stack" و مدت زمانی بعد بگوییم "چیزی که قبلا ذخیره کرده ام را بده" یا "pop it off the stack" . در مقالات آتی شما خواهید دید که موضوع پشته "stack" نقش مهمی را در بکارگیری ماتریسها بازی میکند. یک ارزش حالت تنها در OpenGL یا یک محدوده کامل ار ارزشهای حالت مربوطه میتوانند در یک پشته صفت و با کمک دستور زیر قرار بگیرند.

void glPushAttrib(GLbitfield mask); // this way

متقابلا ارزشها با کمک دستور زیر قابل بازیافت هستند :

void glPopAttrib(GLbitfield mask); // this way
 

Similar threads

بالا