تبليغاتX
OpenGL & Computer graphics

OpenGL & Computer graphics

وبلاگ آموزش گرافیک کامپیوتری و OpenGL و سایر موضوعات وابسته

شناخت کامپایلر ها و محیط های توسعه مجتمع ( قسمت دوم )

با عرض سلام خدمت دوستان :

 

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

 

3. سومین کامپایلری که قصد معرفی آن را دارم کامپایلر Pelles C میباشد که کامپایلری عالی است و البته تنها از زبان C پشتیبانی میکند. این کامپایلر بسیار قدرتمند بوده و برنامه هایی با حجم کم و بهینه شده تولید میکند. این را من خودم بشخصه تجربه کرده ام بدین صورت که دو برنامه یکسان را با این کامپایلر و با MinGW کامپایل کردم البته هیچکدام از گزینه های مربوط به بهینه سازی کد را در هیچ کدام از این دو کامپایلر فعال نکردم. اما کد خروجی Pelles C حجم کمتری داشت (لازم به ذکر است که برنامه مورد ذکر برنامه ای تحت ویندوز بود). و بار دیگر در برنامه ای دیگر کد خروجی Pelles C حجم خروجی بزرگتری داشت.( و این یک برنامه تحت داس و کنسولی بود).

 

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

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

نکته دیگری که لازم است اینجا به دوستان تازه کار متذکر شوم اینست که اگر میخواهید برنامه ای بنویسید که در آن از قابلیتهای ویژه C++ استفاده نمیکنید سعی کنید از فایلهای سر آیند "C" استفاده کنید و نه از فایلهای هدر C++. برای اینکه واضحتر بگویم یک مثال می آورم. در برنامه ساده زیر من هیچ گونه استفاده ای از قابلیتهای C++ نکرده ام. یک برنامه ساده است که یک خط متن را روی صفحه چاپ میکند. خوب این برنامه را میتوان به دو صورت نوشت. با استفاده از فایل هدر "iostream.h" و یا با استفاده از فایل هدر "stdio.h" که متعلق به "C" است.

 

برنامه اول که با کمک "C" نوشته شده :

1:  #include <stdio.h>   // this way 

2: 

3:  int main()

4:  {

5:      printf("this is a test\n");

6:      return 0;

7:  }

 

برنامه دوم که با کمک "C++" نوشته شده :

 

1:   #include <iostream.h>     // this way 

2:  

3:   int main()

4:   {

5:        cout << "this is a test" << endl;

6:        return 0;

7:   }

 

با کامپایل هر کدام از این دو برنامه در محیط Dev-C++ به این نتیجه میرسیم که برنامه ای که از فایلهای هدر و کلا کتابخانه "C" استفاده کرده حجم بسیار بسیار کمتری نسبت به همتای خود که با کمک کتابخانه و فایل هدر "C++" نوشته شده برخوردار میباشد. حجم نمونه "C" برابر با 15.2 و حجم نمونه "C++" برابر با 454 میباشد( مبنا کیلو بایت میباشد).

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

اطمینان 100% در مورد آن ندارم. که علت افزایش حجم حتما همین باشد. اما چیزی که مسلم است اینست که تفاوت حجم کد خروجی در دو زبان بسیار چشمگیر است).

 

البته این موارد چندان ارتباطی با وبلاگ ما نداشت اما تنها به عنوان یک راهنمایی کوچک لازم دیدم آن را برای دوستان عنوان کنم.

 

این کامپایلر "Pelles C" مجهز به یک IDE سر خود نیز میباشد و از قدرت خوبی در کامپایل برنامه های "C" برخوردار است و دیگر شما لازم نیست بدنبال IDE برای آن بگردید.

 

 

4. کامپایلر دیگری که قصد معرفی آن را دارم Open Watcom میباشد که سابقه طولانی با خود به همراه دارد و بتازگی بصورت رایگان در اختیار همه قرار داده شده است. این کامپایلر یک IDE خوب به همراه یک سری کامل از ابزارهای جانبی را با خود یدک میکشد. آنقدر ابزار با خود دارد که تقریبا نیاز هر اهل فن و برنامه نویس حرفه ای را به راحتی برطرف میسازد. احتمالا بسیاری از دوستان با آن آشنا هستند. البته احتمالا حجم آن یک مقدار برای دانلود زیاد است (نزدیک به 60 مگابایت). ولی اگر کسی آرزوی استفاده از کامپایلری فوق العاده و رایگان و قابل رقابت با بزرگان این عرصه را دارد باید بگویم این همان چیزی است که بدنبالش هستید.

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

http://www.openwatcom.org/index.php/Download

 

5. کامپایلر LCC-Win 32 نیز از جمله کامپایلر هایی است که IDE مخصوص به خود را بهمراه دارد و برای استفاده غیر تجاری رایگان است. در سطح اینترنت شناخته شده است و قابلیت تولید اکثر انواع برنامه ها را دارد. (همچون دیگر کامپایلر های معرفی شده قابلیت تولید برنامه های کنسولی و تحت ویندوز و کتابخانه های دینامیک و استاتیک و ... را دارد). البته استفاده از آن را چندان به مبتدیان پیشنهاد نمیکنم چون IDE آن زیاد برای مبتدیان جذاب و راحت نمیباشد.

 

برای دانلود و آشنایی با آن میتوانید به این آدرس مراجعه کنید : (لازم به ذکر است که آخرین نگارش این کامپایلر 4.0 است و در سال 2006 آماده شده است)

http://www.cs.virginia.edu/~lcc-win32

 

6. و اما به عنوان آخرین مورد قصد دارم IDE ای بنام MinGW Developer Studio را به شما معرفی کنم که توسط عده ای برای کامپایلر MinGW طراحی شده است. بد نیست و به راحتی جوابگوی برنامه نویسانی است که از آن انتظاراتی در حد IDE های حرفه ای ندارند. راحت سبک و بی دردسر است و با کامپایلر MinGW نهایت سازگاری را دارد چون صرفا برای آن طراحی شده است. بطور خلاصه محیط ساده و صمیمی دارد. برای آشنایی و تماشای Screenshot های آن و دانلودش میتوانید به این آدرس مراجعه کنید:

http://www.parinyasoft.com

 

 وبه عنوان یک نطق خارج ازدستور(چی گفتم)این کامپایلر آخری را هم معرفی میکنم. بلهDigital Mars را فراموش کردیم. البته این کامپایلر بدون IDE ارایه میشود ولی شما با داشتن یکی از دو IDE ی Relo و یا CodeBlocks میتوانید این کامپایلر را به هر کدام از آنها که بخواهید معرفی کرده و استفاده کنید یا به عبارت بهتر حالش رو ببرید (یکم شوخی هم برای رفع خستگی دوستان ضرر نداره).

البته هنوز کامپایلر ها و IDE های زیاد دیگری هستند که ما در اینجا معرفی نکردیم و شما میتوانید با مراجعه به این صفحه به لیست کاملی از آنها به همراه توضیحی مختصر دسترسی داشته باشید. البته در اینجا چیزهای مفید دیگری مانند کتابخانه های رایگان برای C++ نیز معرفی شده است:

 

http://www.freebyte.com/programming/cpp

به عنوان آخرین نکته خطاب به دوستانی که هنوز در استفاده از این کامپایلر ها و IDE ها مردد هستند و دلشان برای آسایشی که در پناه MFC داشتند تنگ میشود wxWidgets را معرفی میکنم. این کتابخانه ای است کا با تمام کامپایلر ها قابل اجتماع است و نمیگذارد دوستان دلتنگ MFC شوند حتی به جرات میتوان گفت که از MFC نیز بهتر است و هنوز هم تلاش برای بهبود آن ادامه دارد و در قالب یک پروژه در حال توسعه است.

 

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

 

 

 

+ نوشته شده در  دوشنبه بیست و نهم خرداد 1385ساعت   توسط ( ساسان و محمد )  | 

شناخت کامپایلر ها و محیط های توسعه مجتمع ( قسمت اول )

دوستان سلام :

 

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

 

و اما دلایل من در مورد معرفی این کامپایلر ها و IDE ها :

 

  1. همانطور که پیشتر نیز گفتم من از محصولات مایکروسافت استفاده نمیکنم مگر آنجایی که مجبور باشم. مانند سیستم عامل ویندوز و واژه پرداز Word (البته بخش مهمی و زیادی از زندگی من در دنیای شیرین و دوست داشتنی لینوکس میگذرد).
  2. در هیچ کدام از آموزش هایی که در این وبلاگ به دوستان داده میشود از محیط ویژوال استدیو به هیچ عنوان استفاده نمیشود.
  3. کار کردن با کامپایلر ها و IDE های مختلف دوستان را از این باور که تنها کامپایلر و IDE مایکروسافت در این دنیا وجود دارد دور میسازد.
  4. بسیاری از این محیط ها و کامپایلر ها در عین رایگان بودن هیچ چیز از نمونه تجاریشان (مخصوصا ویژوال استدیو) کم ندارند.
  5. دوستان با استفاده از محیط ها و کامپایلر های دیگر میتوانند توانایی ها و دانسته هایشان را بطور زیادی گسترش دهند و هیچگاه متکی به یک سیستم عامل یا محیط خاص نباشند.
  6. و در آخر این نکته که تنوع هم چیز خوبی است.

 

و اما معرفی کامپایلر ها و IDE های رایگانی که برای C و C++ تهیه شده اند :

 

  1. اولین پیشنهاد و شاید حرفه ای ترین پیشنهاد برای دوستان کامپایلر GCC میباشد. که محصولی رایگان بوده و قدرتی فراوان دارد بطوری که از آن بصورت حرفه ای در سیستم عامل های لینوکس و یونیکس استفاده میشود. اما ناراحت نباشید ورژن تحت ویندوز این کامپایلر قدرتمند بنام MinGW برای شما آماده شده است. که در حقیقت همان gcc است که کتابخانه ها و فایلهای هدر ویندوز به آن اضافه شده است. خوب برای این کامپایلر قدرتمند IDE های گوناگون و رایگان زیادی وجود دارد از جمله دو IDE به نامهای Dev-C++ و CodeBlock که شما با دانلود هر کدام از این IDE ها صاحب یک نسخه تر و تمیز از جدیدترین ورژن MinGW نیز میشوید. هر دوی این IDE ها بسیار زیبا و قوی هستند. هر چند Dev-C++ IDE یک مقدار قدیمی تر است و سابقه بیشتری دارد اما در مقابل CodeBlock نیز چیزی کم ندارد و با محیط جذاب و کارآیی خوبش آینده خوبی در پیش دارد.

 

برای دانلود IDE ی CodeBlocks به همراه کامپایلر MinGW میتوانید به این آدرس مراجعه کنید.البته لازم به ذکر است که این IDE با کامپایلر های دیگری مانند Borland C++ Builder ویا Digital Mars هم میتواند کار کند :

 

www.codeblocks.org

 

و برای دانلود IDE ی Dev-C++ به همراه کامپایلر MinGW میتوانید به این آدرس مراجعه کنید :

 

www.Bloodshed.net

 

  1. سومین IDE ای که امروز قصد معرفی آن را دارم Relo میباشد که محیط فوق العاده ساده ای دارد و شاید به خاطر این ساده و خودمانی بودن یکی از بهترین IDE ها برای برنامه نویسان تازه کار C و C++ است که از سر و کله زدن با منو ها و قابلیت های گوناگون IDE های بزرگ بیزارند. این را جدا میگویم که اگر تازه به جمع برنامه نویسان C/C++ پیوسته اید حتما این IDE را امتحان کنید. این IDE در عین سادگی بسیار قدرتمند بوده و به راحتی با کامپایلرهای Borland-gcc-DMars-VC مجتمع میشود. و این یک مزیت است.

 

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

 

http://www.fifsoft.com/relo/

 

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

 

تا بعد خدانگهدار

منبع : در نوشتن این مطلب از هیچ منبعی استفاده نکردم. اینها تنها تجربیات خودم است.

 

 

+ نوشته شده در  دوشنبه بیست و نهم خرداد 1385ساعت   توسط ( ساسان و محمد )  | 

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

با عرض سلام خدمت دوستان و همراهان وبلاگ OpenGL & Computer graphics :

 

اول از همه از آقای voldemort بابت نظرات خوبشون نهایت تشکر را دارم. دوست عزیز از این که با پیشنهادات خوبت به من کمک میکنی بسیار ازت ممنون هستم. در مورد RSS هم بروی چشم حتما پیگیرش میشم. اما در مورد مقالات وبلاگ هر زمان به سطح مطلوب و زیادی رسید حتما همشون را یا در قالب یک pdf ویا pdf های جداگانه تنظیم میکنم و روی یک سرور برای دوستان آپلود میکنم.

 

چطورید دوستان بیحال من. آقا شما چه مشکلی دارید که اینقدر بابت لودینگ صفحه منتظر میشید و مقالاتی که من با زحمت آماده کردم را میخونید (دیگه بیشتر ادامه نمیدم تا شکل منت به خودش نگیره) ولی زحمت یه نظر کوچولو را بخودتون نمیدید.

 

و اما هدف از نوشتن این مطلب :

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

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

 

خوب پس چاره چیست :

اما چاره ای که من برای این مشکل اندیشیده ام ترجمه سلسله آموزشهای NeHe برای OpenGL است که الحق از بهترین Tutorial هایی هست که در سطح اینترنت برای آموزش OpenGL میتوان یافت. و در کنار آموزشهایی که از کتاب OpenGL SuperBible 3rd Edition برایتان مینویسم در پست های جداگانه در هر پست یک درس از آموزشهای NeHe را نیز ترجمه میکنم و در وبلاگ قرار میدهم.البته این دو هیچ ربطی بهم ندارند و فکر نکنید که بطور مثال آموزشهای NeHe باید در راستای آموزشهای کتاب باشد. بلکه ایندو هر کدام جداگانه مسیر خود را در آموزش OpenGL طی میکنند.

 

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

 

امیدوارم اینگونه توانسته باشم دوستانی که مایلند هر چه زودتر وارد کدنویسی شوند را نیز راضی کنم. هر چند که اینجا کمتر کسی از دوستان نظری میدهد و انگار این وبلاگ هنوز جای خود را پیدا نکرده است. البته من ناامید نمیشوم و همچنان ادامه میدهم.

 

موفق و موید باشید.

 

 

+ نوشته شده در  دوشنبه بیست و نهم خرداد 1385ساعت   توسط ( ساسان و محمد )  | 

مقالات آموزش 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ساعت   توسط ( ساسان و محمد )  | 

مقالات آموزش 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ساعت   توسط ( ساسان و محمد )  | 

OpenGL در لینوکس

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

دوست عزیز آقای Kochol در جواب به سئوال شما یه مقدار سرچ کردم که حاصلش این لینکها بود شاید بتونه بهت کمکی بکنه :

http://wiki.linuxquestions.org/wiki/OpenGL

http://www.codeskipper.com/article/5

http://www.linuxjournal.com/article/0174

البته بهترین راهنمایی برای OpenGL در لینوکس اینه که از کتابهای زیر یا ایبوک اونها استفاده کنی.

و یا کتابی که من اکثر مقالاتم را از روی اون ترجمه میکنم. کتاب OpenGL SuperBible 3rd Edition در فصل پانزدهم کاملا در این مورد صحبت کرده که میتونی از این آدرس دانلودش کنی :

دانلود کتاب OpenGL SuperBible 3rd Edition یالا سریعتر دانلودش کن اگه عشق OpenGL داری

دوستان لینوکسی هم میتونن برای یادگیری OpenGL در Linux از همین منابع استفاده کنند. و البته با یه سرچ کوچک توی گوگل میشه به سایت های زیادی در رابطه با OpenGL Programming in Linux دسترسی داشته باشند.

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

+ نوشته شده در  یکشنبه چهاردهم خرداد 1385ساعت   توسط ( ساسان و محمد )  | 

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

دوستان سلام. قبل از این که آموزش امروز را شروع کنم لازم دیدم از تعدادی از دوستان که در این مدت با نظرات خود من را به ادامه این راه تشویق میکردند تشکر کنم.

آقایان سلطان شپش ها (البته آیدی این دوست مان این میباشد و من قصد جسارت به ایشان را ندارم.) و آقای Kochol و منتظر سبز و voldemort و سیروس که با نظراتشان واقعا به من دلگرمی دادند.

و اما مقاله آموزشی امروز

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

 

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/opengl/glut/download.xml

 

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

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

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

 

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

 

+ نوشته شده در  یکشنبه هفتم خرداد 1385ساعت   توسط ( ساسان و محمد )  | 

مقالات آموزش 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.h>  

#include <GL/gl.h>    

#include <GL/glu.h>    

 

و اما حالا میرسیم به توضیحاتی که قرار بود من در مورد پیاده سازی مایکروسافت انحصارطلب پدر سوخته از 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 SuperBible 3rd Edition و سایتهای gamedev.net و glew.sourceforge.net و

elf-stone.com/glee.php و مقداری نیز از اطلاعات شخصی خودم

 

+ نوشته شده در  شنبه ششم خرداد 1385ساعت   توسط ( ساسان و محمد )  | 

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

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

 

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

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

 

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

 

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

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

 

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

 

تصویر 1-2

 

معمولا سازندگان کارت های گرافیکی یک درایور سخت افزاری با رابط های 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

 

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

 

The Pipeline :

 

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

 

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

 

تصویر 3-2

 

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

 

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

 

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

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

 

 

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

+ نوشته شده در  شنبه ششم خرداد 1385ساعت   توسط ( ساسان و محمد )  | 

مقالات آموزش 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 SuperBible 3rd Edition

 

 

+ نوشته شده در  پنجشنبه چهارم خرداد 1385ساعت   توسط ( ساسان و محمد )  | 

مقالات آموزشی گرافیک کامپیوتری و سه بعدی ( قسمت سوم )

کاربردهاس مشترک گرافیک سه بعدی :

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

 

Real-time 3D :

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

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

 

تصویر 15-1

تصویر ۱۵-۱

 

برنامه ها برای گرافیک سه بعدی بر روی کامپیوترها تقریبا بیشمار هستند. شاید عمومی ترین استفاده از گرافیک کامپیوتری سه بعدی بازیهای رایانه ای باشند. امروزه به سختی میتوان کامپیوتری را یافت که نیاز به یک کارت گرافیک سه بعدی نداشته باشد. سه بعدی همیشه برای تجسمات علمی و برنامه های مهندسی معروف بوده است. رابط های گرافیکی نرم افزاری هم از سخت افزار سه بعدی استفاده فراوان میبرند. برای مثال ورژن جدید سیستم عامل Macintosh os x برای رندر کردن تمام پنجره ها و کنترل ها و جلوه های تصویری از OpenGL استفاده میکند. تصاویر 16-1 ال 20-1 تعدادی از برنامه های بیشماری را نشان میدهد که برای رندر تصاویرشان و تولید تصاویر سه بعدی اینتراکتیو از OpenGL استفاده میکنند.

تصویر 16-1

تصویر ۱۶-۱

تصویر 17-1

تصویر ۱۷-۱

تصویر 18-1

تصویر ۱۸-۱

تصویر 19-1

تصویر ۱۹-۱

تصویر 20-1

تصویر ۲۰-۱

گرافیک سه بعدی غیر همزمان Non-Real-Time :

برای برنامه هایی که از گرافیک سه بعدی بلادرنگ استفاده میکنند قانونی و.جود دارد. با دادن فرصت بیشتری برای پردازش تصاویر شما میتوانید گرافیک های سه بعدی با کیفیت بالاتری ایجاد نمایید. به طور مثال بعضی از نرم افزارهای مدل سازی از گرافیک سه بعدی بلادرنگ برای تقابل با هنرمند برای خلق محتوای مورد نظرش استفاده میکنند. سپس تصاویر به برنامه دیگری فرستاده میشوند (ray tracer) که تصاویر را رندر میکنند. رندر کردن یک فریم تنها برای انیمیشنی مانند داستان اسباب بازی به ساعتها زمان بر روی یک کامپیوتر سریع نیاز دارد. این پروسه رندر و ذخیره سازی صدها فریم یک انیمیشن را میسازد که بطور رشته متوالی قابل پخش مجدد میباشد. اگرچه پخش تصاویر انیمیشن ممکن است یک عمل بلادرنگ به نظر برسد اما اینطور نیست. چون آن اینتراکتیو نیست در نتیجه آن بلادرنگ نیست بلکه بیشتر یک سری تصاویر از پیش رندر شده میباشد.

 

تصویر ۲۱-۱ عکسی را نشان میدهد که طرحش حروف کریستالی است و با OpenGL ایجاد شده است. حروف شفاف هستند و تکنیک های ضد دندانهای و افکت های آیینه ای و سایه بخوبی بر روی آن اعمال شده اند.

تصویر 21-1

تصویر ۲۱-۱

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

+ نوشته شده در  سه شنبه دوم خرداد 1385ساعت   توسط ( ساسان و محمد )  | 

مقالات آموزشی گرافیک کامپیوتری و سه بعدی ( قسمت دوم)

مختصری درباره افکت های سه بعدی :

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

 

پرسپکتیو Perspective :

پرسپکتو به زاویه بین خطوط اشاره میکند که جلوه بعد سوم را ایجاد میکنند. شکل۴-۱ یک مکعب سه بعدی را نشان میدهد که با خطوط طراحی شده اند. این جلوه قدرتمندی است. اما آن هنوز میتواند باعث خطای ادراک شود که قبلا نام در موردش صحبت کردیم.( مدتی به تصویر خیره نگاه کنید میبینید که آن شروع به پریدن به بیرون و داخل میکند). در شکل ۵-۱ مغز اطلاعات بیشتری از گرایش واقعی مکعب دارد علت آن برداشته شدن خطوط پنهان تصویر است. شما انتظار دارید که جلوی یک شی پشت آن را از نظر بپوشاند. برای سطوح سه بعدی ما این روش را حذف کردن خطوط پنهان مینامیم.

تصویر 5-1

تصویر ۵-۱

رنگ و سایه ( Color and Shading ) :

اگر ما به تصویر مکعب 1-5 به اندازه لازم خیره شویم میتوانیم خودمان را متقاعد کنیم که به یک تصویر تو رفته نگاه میکنیم و نه به سطوح بیرونی یک مکعب. برای افزایش ادراکمان ما باید به آنسوی خطوط طراحی حرکت کنیم و رنگ را اضافه کنیم تا یک شی سه بعدی خلق شود. تصویر 1-6 نشان میدهد که وقتی ما رنگ قرمز را به مکعب اضافه کنیم چه اتفاقی میافتد. آن دیگر شبیه یک مکعب نیست. با اضافه کردن یک رنگ متفاوت به هر سطح همانطور که در تصویر 1-7 نمایش داده شده ما دوباره درک سه بعدی مان از شئ را به دست می آوریم.

تصویر 6-1

تصویر ۶-۱

تصویر 7-1

تصویر ۷-۱

نور و سایه ها ( Light and Shadows ) :

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

این همچنین نشان میدهد که در بالای یکی از گوشه های مکعب چراغی روشن است. همانطور که در تصویر 1-8 نشان داده شده است. عکس 1-9 با اضافه کردن یک سایه در پشت مکعب یک گام جلوتر رفته است. در اینجا حیله ما بسیار متقاعد کننده است.

تصویر 8-1

تصویر ۸-۱

تصویر 9-1

تصویر ۹-۱

نگاشت بافت ( Texture Mapping) :

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

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

تصویر 10-1

تصویر ۱۰-۱

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

شکل ۱۱-۱تاثیر مه را در صحنه نمایش میدهد. توجه کنید که مه چطور بر باور پذیری زمین تاثیر دارد.

شکل 11-1

تصویر ۱۱-۱

آمیختگی و شفافیت ( Blending and Transparency ) :

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

تصویر 12-1

تصویر ۱۲-۱

ضد دندانه ای ( Antialiasing ) :

دندانه دار بودن ( کنگره دار بودن ) یک افکت مرئی بر روی صفحه است که علت آن اینست که تصویر از پیکسلهای گسسته تشکیل شده است. در تصویر 1-13 شما میتوانید ببینید که خطوطی که مکعب را ساخته اند لبه های دندانه دار دارند. با یک آمیختگی خوب و با دقت خطوط با پشت زمینه شما میتوانید لبه های دندانه دار را محو کنید و به خطوط سیمایی نرم و لطیف ببخشید. همانطور که در تصویر 1-14 نشان داده شده است.

 

این تکنیک آمیختگی آنتی الیزینگ نامیده میشود.. شما همچنین میتوانید این تکنیک را به لبه چند ضلعی ها اعمال کنید تا صحنه ای واقعی تر داشته باشید.  

 

تصویر 13-1

تصویر ۱۳-۱

 

تصویر 14-1

تصویر ۱۴-۱

 

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

+ نوشته شده در  سه شنبه دوم خرداد 1385ساعت   توسط ( ساسان و محمد )  | 

مقالات آموزشی گرافیک کامپیوتری و سه بعدی ( قسمت اول)

مقدمه ای بر گرافیک کامپیوتری :

 

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

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

 

CRT وارد میشود :

 

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

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

به صورتی که جداول و اشکال نمیتوانستند. بسیاری از برنامه نویسان ماجراجو توانستند بازیهای ساده ای نظیر Lunar Lander ویا Pong را طراحی کنند که با خطوط ساده ای طراحی شده بودند که چندین بار در ثانیه ریفرش میشدند.

 

اصطلاح Real-time اولین بار به تصاویری که متحرک بودند اطلاق شد. یک استفاده گسترده از کلمه در علم کامپیوتر که به این معناست که کامپیوترها میتوانند اطلاعات را با همان سرعتی که وارد میشوند و حتی سریعتر پردازش نمایند. برای مثال تلفن زدن یک عمل real-time است که انسانها در آن شرکت دارند. شما صحبت میکنید و شنونده فورا صدای شما را میشنود و به آن واکنش نشان میدهد. و به شما این اجازه را میدهد که حرفهای او را شنیده و واکنش نشان دهید و همینطور الی آخر. در حقیقت یک تاخیری به علت مسائل الکترونیکی وجود دارد اما این تاخیر معمولا برای کسانی که مشغول مکالمه هستند جزیی میباشد. در مقام مقایسه نوشتن نامه یک عمل real-time نیست.

 

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

Real-time میتواند خروجی های قابل خواندن عددی یا بازیهای اینتراکتیو و شبیه سازیهای مجازی را نمایش دهد.

پیش به سوی سه بعدی : اصطلاح سه بعدی یا 3D به این معناست که یک شئ در حال نمایش سه بعد قابل اندازه گیری دارد طول و عرض و عمق. یک مثال برای یک شئ دو بعدی یک قطعه کاغذ است بر روی میزتان که عمق (ضخامت) چندانی ندارد. و مثالی برای یک شئ سه بعدی یک قوطی کنسرو است که پیرامون آن طول و عرضش را نشان میدهد و بلندی آن نمایشگر عمق است. بسته به پرسپکتیو شما میتوانید تعیین کنید که کدام طرف قوطی طول و یا عرض باشد اما در نهایت قوطی سه بعد دارد.شکل 1-1 نشان میدهد که ما چگونه میتوانیم ابعاد قوطی و کاغذ را مقایسه نماییم.

تصویر 1-1

                                                          تصویر ۱-۱

 

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

 

 

2D + Perspective = 3D

اولین گرافیک کامپیوتری بدون شک بصورت شکل ۲-۱ ظاهرشدند. جایی که شما میتوانید یک مکعب سه بعدی ساده را که با 12 خط ساخته شده ببینید. چیزی که نمای مکعب را سه بعدی ساخته پرسپکتیو است. ( زاویه بین خطوط که خطای دید در عمق را به ما تلقین میکنند ).

تصویر2-1

تصویر ۲-۱

 

برای تماشای واقعی در فضای سه بعدی شما در حقیقت نیاز دارید که شئ را با هر دو چشم ببینید و هر چشم یک تصویر جداگانه از شئ را ثبت میکند. به تصویر 1-3 دقت کنید هر چشم یک تصویر دو بعدی را دریافت میکند که مانند یک تصویر موقت بر روی شبکیه هر چشم نگاشته میشود. این دو تصویر اندکی با هم تفاوت دارند چون از دو زاویه جداگانه دریافت شده اند.سپس مغز این دو تصویر را با هم ترکیب میکند تا یک تصویر مرکب سه بعدی در سر شما پدید آورد.

 

تصویر 3-1

تصویر ۳-۱

 

در شکل 1-3 زاویه بین دو تصویر با دور شدن شئ کوچکتر میشود. شما میتوانید این اثر سه بعدی را با افزایش زاویه بین دو تصویر تقویت کنید.

صفحه نمایش کامپیوتر یک تصویر تخت بر روی سطحی تخت است و نه دو تصویر متفاوت از منظر متفاوت که بر روی هر چشم بیفتد.

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

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

 

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

 

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

تصوویر 4-1

تصویر ۴-۱

مصنوعات سه بعدی : دلیل اینکه وقتی شما جلوی یکی از چشمانتان را میپوشانید دنیا به یکباره تخت نمیشود این است که هنوز افکت های سه بعدی زیادی حاظر هستند وقتی که دو بعدی تماشا میشوند. این افکت ها (تاثیرات) به اندازه ای هستند که باعث شوند مغز شما به راحتی مسافت و عمق را تشخیص دهد. مسلم ترین چیز اینست که اشیا نزدیک تر بزرگتر از اشیا دور نمایان میشوند.

این افکت پرسپکتیو Foreshortening نامیده میشود. این افکت و تغییرات رنگ و تکسچرها و نور ها و اختلاف در شدت رنگ همه با هم به ادراک ما یک تصویر سه بعدی را اضافه میکنند.

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

+ نوشته شده در  سه شنبه دوم خرداد 1385ساعت   توسط ( ساسان و محمد )  | 

آشنایی با خط مشی کلی این وبلاگ

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

 

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

 

مرحله اول : در این مرحله ما قصد داریم با ارایه یکسری از آموزشهای مقدماتی در باب OpenGL که عموما از کتابهای OpenGL Programming Guide fifth Edition و OpenGL SuperBible 3rd Editon استخراج شده اصول اولیه و برنامه نویسی مقدماتی با استفاده از OpenGL را به شما دوستان بیاموزیم. همچنین در طول این مرحله مقالات و مطالبی نیز از گرافیک کامپیوتری مخصوصا گرافیک سه بعدی تقدیم میشود که بیشتر حالت مقدماتی داشته و خواندن آنها برای ادامه کار ما لازم میباشد.

 

مرحله دوم : تا اینجا ما تقریبا آشنایی مختصری با  OpenGLوگرافیک سه بعدی داریم حالا ما آماده ایم تا با مفاهیم پیشرفته تری روبرو شویم. حال ما شروع به بررسی و آموزش سلسله آموزشهایی میکنیم که من از سایت های مختلف جمع آوری نموده ام. از جمله آموزشهای NeHe که در آدرس http://NeHe.gamedev.net قرار دارد و بسیاری دیگر که به بررسی تکنیکهای پیشرفته OpenGL  میپردازد. همچنین در طی این دوره یکسری مقالات ومطالب در رابطه با تکنیکهای پیشرفته گرافیک کامپیوتری از قبیل bump maping و Normal maping و Motion Blur  و َAnti Alaising  و روشهای مختلف Rendering  و بسیاری دیگر تقدیم دوستان میشود و نحوه پیاده سازی این تکنیکها با مثالهایی کامل در OpenGL  بررسی و آموزش داده میشود.

 

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

 

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

 

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

 

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

 اول : بسیاری از آموزشهای ما در مورد OpenGL مستلزم آشنایی با روش طراحی برنامه با استفاده از توابع API ویندوز میباشد. کسانی که با آن آشنایی ندارند میتوانند با عضویت در سایت

http://persian-designers.com به مقالات و مطالب خوبی در ارتباط با برنامه نویسی مقدماتی ویندوز در سطحی که مورد نیاز ماست دسترسی داشته باشند و اقدام به دانلود و مطالعه این مقالات نمایند.

 

دوم : در بیشتر آموزشها ما از زبان C استفاده میکنیم و گهگاه و به ندرت از زبان C++ .پس آشنایی داشتن با این دو زبان جهت مطالعه آموزشهای ما لازم میباشد.

 

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

+ نوشته شده در  دوشنبه یکم خرداد 1385ساعت   توسط ( ساسان و محمد )  |