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

با عرض سلام خدمت دوستان و خوانندگان همیشگی وبلاگ :

 

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

 

تعيين سايز نقاط در OpenGL :

 

زماني كه نقطه اي را در OpenGL رسم ميكنيد سايز آن يك پيكسل است. براي تعيين اين اندازه به

صورت دستي از تابع زير استفاده ميكنيم.

 

Void glPointSize (GLfloat size);         // this way

 

تابع glPointSize تنها يك مقدار ميگيرد و اين مقدار تعيين كننده ضخامت نقطه ماست.  دقت كنيد اين مقدار محدوديت دارد.

تكه كد زير براي تعيين محدوده ي سايز نقاط و همچنين تعيين فاصله بين آنها بكار ميرود.

 

GLfloat sizes[2];    // Store supported point size range

 

GLfloat step;         // Store supported point size increments

 

 

 

// Get supported point size range and step size

 

glGetFloatv(GL_POINT_SIZE_RANGE,sizes);     // this way

 

glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);      // this way

 

در قطعه كد بالا آرايه ي sizes شامل دو عنصر هست. يكي بزرگترين و ديگري كوچكترين مقدار ممكن براي سايز نقاط ( glPointsize ) بعلاوه متغير step گام يا فاصله مجاز بين نقاط را در خود نگاه ميدارد.( يعني اينكه سايز نقاط مجاز هستند با چه گام هايي از كمترين مقدار به بيشترين مقدار صعود كنند. مثلا اگر range  ما 0 تا 10 باشد  و گام ها 1 اعداد مجاز براي سايز نقاط عبارتند از 0و1و2و....و10)

به عنوان مثال پياده سازي مايكروسافت از OpenGL سايز نقاط رو از 0.5 تا 10 و با گام هاي 0.125 پشتيباني ميكنه.

 

نكته: اگر سايز نقاط رو خارج از محدوده مقرر تعيين كنيد با پيغام خطا مواجه نميشيد بلكه خود برنامه سايز اون رو تنظيم ميكنه.اگر اين سايز كمتر از كوچك ترين سايز ممكن باشه اون رو به كمترين سايز ممكن و اگر بزرگتر از بزرگترين سايز ممكن باشه اون رو به بزرگترين سايز تبديل ميكنه.

مثلا اگر range  ما 1 تا 10 باشه و شما 0.5 رو بديد برنامه عدد رو به 1 و اگر 12 بديد اون رو به 10 تبديل ميكنه.

مهم: نقاط بر خلاف ساير اشكال تحت تاثير perspective نيستند يعني با دور شدن يا نزديك شدن به دوربين بزرگ يا كوچك نميشوند. نكته ديگه اينكه نقاط همواره از مربع ها ساخته ميشوند حتي اگر شما از دستور glPointSize براي تغيير سايز استفاده كنيد فقط اندازه اين مربع ها رو بزرگ يا كوچك

كرده ايد.براي داشتن نقاط گردتر بايد از تكنيك antialiasing استفاده كنيد.

 

همونطور كه ساسان تو پست هاي قبليش توضيح داد OpenGL يك ماشين حالت هستش.شما ميتونيد هر متغير يا خصيصه اي  رو با توابع glEnable/glDisable فعال يا غير فعال كنيد همچنين ميتونيم از تابع glSet براي تعيين اعداد و ثابت هاي عددي استفاده كنيم. در آخر اينكه ميشه با تابع glGet  فعال يا غير فعال بودن تمام خصيصه ها رو مورد بررسي قرار داد. براي اطلاعات بيشتر به پستهاي قبلي توجه كنيد.

تكه كد زير رو براي نمونه آورديم تا طرز كار اين توابعي كه ياد گرفتيم رو نشون بده. برنامه همون شكل دوار قديمي هستش با اين تفاوت كه اين بار سايز نقاط به مرور از كوچكترين به بزرگترين سايز ممكن ميرسه.

 

 

 

 

 

 

 

اين مثال دو تا نكته داره. يكي اينكه تابع  glPointSize بايد خارج از دو تابع  glBegin/glEnd بياد.   دوم اينكه دقت كنيد كه تابع  glPointSize سايز تمام نقاطي رو كه بعد از اون رسم ميشن رو تحت تاثير قرار ميده.

همونطور كه خوانديد اگر سايز نقاط رو خارج از محدوده بديد خود برنامه اونها رو تصحيح ميكنه.اين تصحيح در مورد تمام محدوده هاي متغير ها هستش.يعنی OpenGL براي هر متغيري يه محدوده داره و اگر خارج از اون محدوده عدد دهي بشه برنامه خودش اونها رو به همون صورت كه بالا توضيح داديم تصحيح ميكنه.

يه نكته در مورد سايز نقاط وجود داره و اون اينه كه اگر شما عدد 1 رو براي نمايش يك پيكسل به كار ميبريد پس چطور ميتونيد اعداد كوچك تر از 1 يا عددي مثل 2.5 رو براي pointsize بكار ببريد؟ جواب اينه كه اين عددي كه براي سايز وارد ميكنيد نه پيكسل بلكه قطر دايره اي كه اين نقطه در اون رسم ميشه رو تعيين ميكنه. شما براي اينكه نقاط نرم تري داشته باشيد ميتونيد قابليت point smoothing رو فعال كنيد.طريقه اين كار و استفاده از تكنيك antialiasing رو در فصل هاي بعد با هم ياد ميگيريم.

 

دوستان علاقمند میتوانند نسخه PDF این مقاله را از این آدرس دریافت نمایند.

http://www.rogepost.com/dn/u7z4/OpenGL.rar

 

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

مترجم : محمد عباسی ( سلطان )

 

 

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