تبليغاتX
OpenGL & Computer graphics - مقالات آموزش 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
 

به پایان یکی دیگر از مقالات آموزشیمان رسیدیم. بزودی مقاله کاملی در باره کامپایلر ها و محیط های

برنامه نویسی آماده و در وبلاگ قرار میدهم که مطالعه آن را شدیدا به شما دوستان در جهت پیشبرد

اهدافمان توصیه میکنم.

 

منبع : کتاب OpenGL SuperBible 3rd Edition

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