تبليغاتX
OpenGL & Computer graphics - مقالات آموزش OpenGL قسمت پنجم

مشخصات API :

 

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

 

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

 

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

 

 

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

 

تصویر 1-2

 

تمام انواع داده با یک 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

 

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

GLdouble *doubles[10];   //this way

 

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

 

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

 

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

 

<Library prefix><Root command><Optional argument count><Optional argument type> 
 
تصویر 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 SuperBible 3rd Edition
 
+ نوشته شده توسط ( ساسان و محمد ) در جمعه بیست و ششم خرداد 1385 و ساعت |
Image and video hosting by TinyPic