امیدوارم مثل همیشه خوب و خوش باشین
دوستان اصرار داشتن که جزوه فارسی هم معرفی کنم
اینم جزوه فارسی تالیف آقای دکتر جواد مهری از دانشگاه تبریز که گرافیک کامپیوتری رو با Opengl و تحت زبان خوب C بیان کرده اند: دانلود
گروه گرافیک کامپیوتری دانشگاه ام آی تی
گرافیک کامپیوتری دانشگاه استنفورد
جستجوی کتب گرافیک کامپیوتری در سایت آمازون
عزیزان سلام
قسمت دوم برنامه رو براتون گذاشتم:
-
ساخت پنجرۀ OpenGL
کد زیر، یک پنجره OpenGL میسازد و عنوان آنرا در نوار عنوان برابر my first attempt قرار میدهد:
glutCreateWindow (" my first attempt");
int glut create window ( char* name); :الگوی تابع
همچنین این تابع شناسه یکتایی را برای این پنجره جدید باز میگرداند. از این شناسه میتوانیم برای کنترل چند پنجره گرافیکی بهره ببریم (فصل 3). چون اندازه این پنجره و مکان آنرا تنظیم نکردهایم؛ بصورت پیش فرض به اندازۀ 300×300 پیکسل و در مکان (,0 0) مانیتور یعنی گوشۀ بالای سمت چپ آن قرار میگیرد.
-
پس فراخوانی[1] نمایش
اصولا پس فراخوانی فرایند بکارگیری اشارهگرهای تابع یا توابع مجازی برای ارسال یک آدرس مرجع به یک تابع است. مثلا برای وابسته کردن یک عمل به فشردن یک کلید، یک تابع زیرساختی بصورت پویا به فشردن کلید مرتبط میشود[shirley].
این خط به عنوان تابع پس فراخوان نمایش، تابعRenderScene که قبلاً تعریف کردهایم را اجرا میکند. یعنی هر زمان که لازم است پنجره ترسیم شود، GLUT تابع مورد اشاره در اینجا را فراخوانی میکند.
glutDisplayFunc(RenderScene);
void glutDisplayFunc (void(*func)(void)); : الگوی تابع
به عنوان مثال، این فراخوانی هنگام نمایش پنجره برای اولین بار، تغییر اندازه پنجره یا کنار زدن پنجرهای که آنرا پوشانیده است، صورت میگیرد. فراخوانیهای تمام توابع پرداخت صحنه درون تابع RenderScene صورت میگیرد. دقت کنید که تابع نمایشی که با این تابع پس فراخوانی میشود نباید مقداری را برگرداند (void).
-
تنظیم زمینه پرداخت[2]
خط بعدی نه تابع GLUT و نه تابع OpenGL است، بلکه قرار دادی است که در این نوشتار از آن پیروی میکنیم :
SetupRC();
در این تابع هرگونه مقدار دهی اولیه که پیش از پرداخت لازم است را انجام میدهیم. بسیاری از حالتهای OpenGL لازم است فقط یک بار تنظیم شوند و هنگام پرداخت هر قاب (صفحه حاوی اشیای گرافیکی)، نیاز به تنظیم مجدد ندارند. این گونه موارد را درون این تابع یک بار برای همیشه مقداردهی میکنیم.
آخرین فراخوانی تابع GLUT در انتهای برنامه آمده است:
glutMainLoop ();
void glutMainLoop (void); الگوی تابع
این تابع اجرای چارچوب کاری GLUT را آغاز میکند. پس از اینکه پس فراخوانیهای نمایش صفحه و سایر توابع را تعریف میکنید، با این تابع، GLUT را بکار میاندازید تا پنجره گرافیکی را نمایش دهد. پس از آنکه این تابع یک بار فراخوانی شود هرگز خاتمه نمییابد تا زمانیکه پنجره اصلی را ببندید. این تابع حلقه پردازش رخدادها[3] را آغاز میکند و پیغامهای مخصوص سیستم عامل، زمان سنج، فشردن کلیدها و اجرای پس فراخوانیهای لازم برای بازترسیم[4] صحنه و مانند آن را تا پایان برنامه مورد پردازش قرار میدهد. بدین ترتیب تا وقتی اجرای برنامه را نبستهایم، تمام فرمانهای درون تابع main که با glut آغاز میشوند بارها و بارها فراخوانی میشوند.
[1] call back
[2] Rendering Context
[3] event processing
[4] redraw
یه توضیح:
دوستان لابد تا الان متوجه اونچه می گم شدین ولی فکر کنم بگم بهتر باشه:
اعداد کوچک درون متن که توی کروشه هستن اشاره به پاورقی دارن که معادل انگلیسی یا توضیحی درباره اون عبارتی که توی متن اومده بیان می کنه
ضمنا اسامی ای که داخل کروشه توی متن ذکر شدن اسم کتابایی هستن که برای نگارش اون قسمت ازشون بهره گرفتم
دلم می خواد مطالب رو مستند براتون ارائه بدم
گرچه سرعت پیشروی مون ممکنه الان کند به نظر برسه ولی بعد از ذکر اصول اولیه سرعتمون هم زیاد می شه . گرافیک رایانه ای خیلی مطالب جالبی داره و امیدوارم بتونم خوب این درس رو که توی دانشگاه معمولا به اسم گرافیک کامپیوتری ۱ و ۲ ارائه میشه براتون معرفی کنم
قسمت سوم این برنامه رو در پست بعدی می گذارم
شاد باشین![]()
این برنامه پنجرهای خالی به رنگ آبی با نام «اولین تلاش من[1]» میسازد. در برنامههای آینده، اشیای گرافیکی را درون چنین پنجرهای خواهیم دید. همچنین در پنجره کنسول (اعلان داس)، نوشتههایی را میبینیم که شامل نسخۀ OpenGL که توسط کارت گرافیک شما پشتیبانی میگردد، پرداخت کننده، عرضه کننده و گسترشهای آن و همچنین نسخه GLU کارت گرافیکی رایانه شما و گسترشهای آن است.
[1] my first attempt
اگر در حال اجرای ++Visual C هستید، وقتی پنجرۀ گرافیکی را میبندید، پنجره کنسول همچنان باز است و پیغامpress any key to continue را در آن میبینید و برای تمام شدن برنامه باید کلیدی را بفشارید. این قابلیت استاندارد [IDE [1 مایکروسافت تضمین میکند که بتوانید پیش از آنکه پنجره ناپدید شود، هر خروجی که برنامه شما روی صفحه (درون پنجره کنسول) قرار میدهد را ببینید. اگر برنامه خود را از طریق خط فرمان داس[2] اجرا نمایید چنین امکانی را نخواهید دید. همچنین اگر روی فایل اجرایی برنامه در جستجوگر ویندوز کلیک مضاعف کنید، پنجره کنسول را خواهید دید، ولی هنگامیکه پنجره گرافیکی را میبندید، آن هم ناپدید میشود. البته تمام این موارد به شرطی برقرار است که درون پنجره اعلان داس چیزی نوشته نشود یعنی مثل برنامه این فصل نباشد!
این برنامه ساده شامل پنج تابع کتابخانهای glut گوناگون ( با پیشوند glut)، چهار تابع اصلی Opengl ( با پیشوند gl) و یک تابع از کتابخانه glu (با پیشوند glu) به علاوۀ تابع printf از کتابخانه stdio.h میباشد.
#include < gl/glut.h >
#include < stdio.h >
//>>>>>>>>>>>>>>>>>>>>>> myDisplay <<<<<<<<<<<<<<<<<<<<<<<<
void RenderScene(void)//Called to draw scene
{
glClear(GL_COLOR_BUFFER_BIT); // Clear the window with current clearing color
glFlush(); // Send all output to display
}
//>>>>>>>>>>>>>>>>>>>>>> myInit <<<<<<<<<<<<<<<<<<<<<<<<
void SetupRC(void)//Set up the rendering state
{
glClearColor(0.0f,0.0f,1.0f,0.0f);//Clear background color to this color
}
//>>>>>>>>>>>>>>>>>>>>>> main <<<<<<<<<<<<<<<<<<<<<<<<
void main(int argc, char* argv[])//Main program entry point
{
glutInit(&argc, argv); // Initialize the toolkit
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); // Set display mode
glutCreateWindow("my first attempt"); // Open the screen window
glutDisplayFunc(RenderScene); // Register redraw function
SetupRC();
printf("Graphics device info:"\n------------------\n);
printf("OpenGL Version : %s\n",glGetString(GL_VERSION));
printf("Renderer : %s\n",glGetString(GL_RENDERER; ((
printf("Vendor : %s\n",glGetString(GL_VENDOR));
printf("Extensions : %s\n",glGetString(GL_EXTENSIONS));
printf("GLU Version : %s\n",gluGetString(GLU_VERSION));
printf("GLU Extensions : %s\n\n\n",gluGetString(GLU_EXTENSIONS));
const unsigned char *version = (const unsigned char *)glGetString(GL_VERSION);
printf ("My OpenGL version is: %s\n", version);
const unsigned char *renderer = (const unsigned char *)glGetString(GL_RENDERER);
printf ("My OpenGL renderer is: %s\n", renderer);
const unsigned char *vendor = (const unsigned char *)glGetString(GL_VENDOR);
printf ("My OpenGL vendor is: %s\n", vendor);
const unsigned char *extensions = (const unsigned char *)glGetString(GL_EXTENSIONS);
printf ("My OpenGL extensions are: %s\n", extensions);
const unsigned char *GLUversion = (const unsigned char *)gluGetString(GLU_VERSION);
printf ("My GLU version is: %s\n", GLUversion);
const unsigned char *GLUextensions = (const unsigned char *)gluGetString(GLU_EXTENSIONS);
printf ("My GLU extensions are: %s\n\n\n", GLUextensions);
glutMainLoop(); // Go into a perpetual loop
}
اکنون برنامه را خط به خط مورد بررسی قرار میدهیم.
-
سرآیندها
شامل دو فایل سرآیند به نامهای glut.h (برای دستورات گرافیکی و اعمال مرتبط با آنها) و stdio.h (برای دستور printf ) است.
#include < gl/glut.h >
#include < stdio.h >
-
بدنه برنامه
از آنجایی که اجرای برنامه از تابع main آغاز میشود؛ فعلاً از بقیه قسمتها عبور میکنیم و به سراغ نقطه ورودی هر برنامه C یعنی تابع main میرویم :
void main (int argc ,char* argv[])
که آنرا بصورت زیر هم میتوانیم بنویسیم:
void main (int argc ,char** argv)
برنامههای C/C++ که دارای حالت کنسول هستند همواره از تابع main شروع به اجرا میکنند. اگر یک مبتدی با تجربه هستید شاید بپرسید که WinMain این مثال کجاست. چنین تابعی در این مثال وجود ندارد زیرا در مد کنسول شروع بکار کردهایم و بنابراین نباید کار با تولید پنجره و حلقه پیغام آغاز شود. در win32 میتوانیم همان طور که پنجرههای کنسول را از برنامههای کاربردیGUI میسازیم، پنجرههای گرافیکی را از برنامههای کاربردی کنسول تولید نماییم. این جزئیات در کتابخانه GLUT صرفنظر میشوند. بخاطر داشته باشید که کتابخانه GLUT طراحی شده است تا همین جزئیات بستر پیادهسازی را مخفی نماید.
مشاهده میکنیم که تابع main دارای دو آرگومان ورودی است. این آرگومانها بیشتر برای برنامههای فاقد واسط کاربر گرافیکی کاربرد دارند و برای تنظیم حالات و اختیارات برنامه از خط فرمان به تابع main ارسال میشوند. آرگومان اول (argc) تعداد آرگومانهای ارسالی و آرگومان دوم (argv) مقدار آنها را ذخیره میکند. همواره argc حداقل برابر 1 است زیرا زیرا خود مسیر و نام فایل اجرایی یک آرگومان همیشگی برنامه است. بنابراین مقدار [argv[0 برابر با مسیر و نام فایل اجرایی است و پس از آن نیز کاراکتر Null قرار میگیرد. به عنوان مثالی برای درک بهتر، فرض کنید فراخوانی برنامه myprog.exe از خط فرمان بصورت زیر باشد:
myprog.exe arg1 arg2 arg3
آنگاه مقدار argc برابر 4 و مقادیر argv نیز بصورت زیر است:
argv[1]=arg1
argv[2]=arg2
argv[3]=arg3
argv[0] 0 نیز حاوی مسیر و نام فایل اجرایی است.
اولین خط کد در تابع main، فراخوانی glutInit است که پارامترهای خط فرمان را ارسال میکند و کتابخانه GLUT را مقداردهی اولیه مینماید.این تابع باید فقط یک بار و پیش از هرگونه فرمان OpenGL یا GLUT فراخوانی شود:
glutInit(&argc, argv);
void glut Init (int argc ,char argv); : الگوی[1] تابع
-
مد نمایشی: تک بافری
میدانیم در فرایند پرداخت، رایانه تصاویر را از مدلها میسازد. این مدلها یا اشیا از اولیههای هندسی یعنی نقاط، خطوط و چند ضلعیهایی ساخته شدهاند که با رئوس خود مشخص میشوند. تصویر پرداخت شدۀ نهایی شامل پیکسلهایی است که روی صفحه ترسیم میگردند. پیکسل (عنصر تصویر)[2] کوچکترین عنصر قابل رؤیت تصویر است که سخت افزار نمایشی میتواند روی صفحه قرار دهد [red book].
اکنون باید به کتابخانه GLUT بگوییم که هنگام تولید پنجره از چه مد نمایشی استفاده کند:
glutInitDisplayMode (GLUT_SINGLE, GLUT_RGBA);
void glutInitDisplayMode (unsigned int mode); : الگوی تابع
پرچمهای درون این دستور بیان میکنند که از پنجره تک بافری (GLUT_SINGLE) و مد رنگی RGBA (GLUT_RGBA) استفاده شود که هر دو پارامترهای پیش فرض نیز هستند.
میدانیم بافر، بخشی از حافظه اصلی است که برای ذخیره موقت دادهها توسط ابزارها یا برنامهها بکار گرفته میشود. اطلاعات پیکسلها (مثلاً رنگ آنها) در حافظه درون سطوح بیتی سازماندهی میشوند. یک سطح بیتی ناحیهای از حافظه اصلی است که یک بیت اطلاعات را برای هر پیکسل روی صفحه نمایش نگه میدارد. به عنوان مثال، مشخص میکند یک پیکسل خاص چقدر قرمز باشد. این سطوح بیتی درون بافری قرار دارند که به آن بافر قاب[3] میگوییم. منظور از قاب، هر صفحه شامل اشیای گرافیکی است. این بافر که امروزه درون حافظه کارت گرافیک است، همه اطلاعاتی را نگه میدارد که نمایشگر گرافیکی برای کنترل رنگ و شدت[4] تمام پیکسلهای روی صفحه نیاز دارد [red book].
پنجره تک بافری بدین معنا است که تمام فرمانهای ترسیمی، روی پنجره نمایش یابند. گزینۀ دیگر در این مورد پنجرۀ دو بافری است که در آن، فرمانهای ترسیمی درون یک بافر پشت صفحه ( بافرپسین[5]) اجرا میشوند و سریعاً درون دید پنجره (بافر پیشین[6]) قرار میگیرند. این روش اغلب برای تولید پویانمایی بکار میرود و در ادامه از آن بهره خواهیم گرفت [super Bible] .
مد رنگیRGBA بدین معنا است که رنگها را با ترکیب شدتهای جداگانه رنگهای اصلی قرمز، سبز، آبی و مؤلفه آلفا میسازیم. مؤلفۀ آلفا بیانگر میزان کدر یا شفاف بودن جسم است که در آینده به تفسیر آن خواهیم پرداخت. برخی گزینههای دیگر در این مورد RGB (بدون آلفا) و مد اندیس رنگ (GLUT_INDEX) است. در مد اندیس رنگ، با بکارگیری اندیسی درون یک ظرف رنگ[7]، رنگها را مشخص میکنیم [super bible].
[1] prototype
[2] pixel (PIcture ELement)
[3] frame buffer
[4] intensity
[5] back buffer
[6] front buffer
[7] color palette
ادامه برنامه را در پست های بعدی شرح خواهم داد
موفق و شاد باشین
صبح بهاری و زیبای همگی بخیر
امروز سرفصل کلیه دروس رشته کامپیوتر در گرایش نرم افزار هم کارشناسی و هم کارشناسی ارشد رو گذاشتم. می تونین سرفصل دروس گرافیک کامپیوتری ۱ و ۲ رو هم توش ببینین. اگه کسی سرفصل درس گرافیک کامپیوتری یشرفته رو هم که مال کارشناسی ارشد هست داره لطفا برام بفرسته
متشکرم.
همچنین لینک رشته های مرتبط عبارتند از: مهندسی تکنولوژی نرم افزار و کاردانی ناپیوسته علمی کاربردی نرم افزار و کاردانی پیوسته کامپیوتر
دفعه بعد اولین برنامه خودمون رو باهم اجرا می کنیم و شرح می دیم.
در این نوشتار راه اندازی OpenGL در Visual Studio 2008 (تحت Visual C++) درون محیط ویندوز را شرح میدهیم. این روند در سایر نسخههای Visual Studio نیز با کمی تغییر قابل انجام است. دقت فرمایید که فقط محیط VC++ را بکار میگیریم و نیازی به یادگیری زبان VC++ نخواهیم داشت.
فایلهای لازم برای راه اندازی OpenGL تحت VC++ را میتوانید از اینجا دانلود نمایید .
هر یک از فایلهای درون پوشۀ Glut را در مسیرهای زیر کپی نمایید:
C:\ Windows\ System 32\ glut32.dll
*این فایل از خطای زمان اجرا پیشگیری میکند. اگر هنوز هنگام اجرای برنامهها خطای Cannot find glnt32.dll را دریافت میکنید، این فایل را درون پوشه C:\ Windows\ System نیز کپی نمایید.
C:\ Program Files\ Microsoft Visual Studio 9.0\ vc\ include\ GL\glut.h
*این فایل از خطای زمان کامپایل پیشگیری میکند. اگر پوشۀ GL موجود نیست، خودتان آن را بسازید زیرا برنامههای ما به آن رجوع خواهند کرد.
C:\ Program Files\ Microsoft Visual Studio 9.0\ vc\lib\ glut32.lib
*این فایل از خطای زمان پیوند پیشگیری میکند. اگر هنوز خطای Cannot open glut 32.lib را دریافت میکنید، با کلیک راست روی پوشه پروژۀ خود در بخش Explorer Solution و طی کردن مسیر زیر، فایلهای کتابخانهای OpenGL را به پیونددهنده[1] معرفی نمایید:
Solution Explorer\ Project Name \ right click\ Properties\ Configuration Properties \ Linker \ Input\ opengl32.lib glu32.lib glut32.lib
دقت داشته باشید که جداکننده نام فایلها یک فاصله[2] " " است و از کاما "," یا سمی کالن";" برای جدا کردن نامها استفاده نکنید و گرنه باز هم پیغام خطای عدم یافتن فایل را دریافت خواهید نمود.
همچنین میتوانید بجای روش فوق، در ابتدای برنامه بصورت زیر مکان فایل کتابخانهای glut را به پیوند دهنده اعلام نمایید.
pragma comment ( lib , "glut32.lib")#
ساخت پروژه[3]
برای ساخت پروژه مسیرهای زیر را طی کنید:
ctrl+shift+n ) File\New\Project )
2) Project types\ Visual C++
3) Templates\ Win32 Console Application
۴) نامگذاری پروژه
اگر گزینه Create directory for solution انتخاب شده باشد، فایلهای راه حل[4] را درون پوشه جدیدی به همین نام میریزد، ولی نیازی به انتخاب این گزینه نیست. راه حل در واقع فایل کد به همراه فایلهای کمکی لازم برای اجرای پروژه شما است.
اکنون یک روند جادویی[5] آغاز میشود که باید انتخابهای زیر را در آن انجام دهیم:
5) Win32 Application Wizard\ Next\Empty project
اگر گزینۀ Precompiled header را تیک بزنیم یک فایل منبع میسازد که از قبل درون آن کد پیش کامپایل قرار دارد و ما باید کد برنامۀ خود را پس از "#include "stdatx.h درج کنیم. امّا برای اینکه کامپایلر چیزی به کد ما نیفزاید، میتوانیم گزینۀ Empty project را برگزینیم (اگر پروژه خالی[6] بسازیم انتقال آن به سیستمهای دیگر راحتتر است).
سپس خودمان بصورت زیر فایل منبع را نیز ایجاد مینماییم:
Ctrl+n) File\ New\ File )
2) Categories\ Visual C++
3) Templates\ C++ File (.cpp)
اکنون فایل منبع را با نام پیش فرض آن (source1.cpp) یا با نام مورد نظرتان، درون پوشۀ پروژه خود ذخیره کنید. توجه داشته باشید که پروژهها بصورت پیش فرض در مسیر زیر ایجاد و ذخیره میشوند:
C:\My Documents\ Visual Studio 2008\ Projects
ذخیره فایل منبع با نام دلخواه شما با طی مسیر زیر انجام میشود:
File\ Save source1.cpp As \
اکنون از قسمت Solution Explorer در پنجره اصلی، فایل منبع را بصورت زیر به پروژه بیفزایید:
Solution Explorer\ Source Files\ right click\ Add\ Existing Item
بدین ترتیب از ظهور پیغام خطای زیر در هنگام کامپایل جلوگیری میکنید:
Intermediate. manifest: general error c1010070 : failed to load and parse the manifest. The system cannot find the file specified.
اکنون زمان کامپایل و پیوند پروژه و اصطلاحاً ایجاد راه حل است:
Build/ Build solutio( یا کلید F7)
اگر در برنامهای، در این مرحله خطای پیوند زیر را دریافت نمودید:
Fatal error LNK 1104. Cannot open file "libc.lib"
آنگاه در مسیر زیر نام این فایل را بنویسید تا این فایل نادیده گرفته شود.
Solution Explorer\ Project Name \ right click\ Properties\ Configuration Properties\ Linker \ Input\ Ignore Specific Library/…
اگر فایل با موفقیت کامپایل و پیوند شده است (Build: 1 succeeded, 0 failed ) آنگاه میتوانید فایل اجرایی را بصورت زیر اجرا کنید:
( یا کلید F5) Debug\ Start Debugging
نکته1
در ویژوال استودیو NET . در برنامههایی که دارای این دو فایل سرآیند هستند : stdlib.h و glut.h
باید ابتدا < stdlib.h > و سپس < glut.h > را بنویسیم و گرنه خطای زیر را دریافت میکنیم:
Error c2381: 'exit': redefinition; -declspec (no return) differs
C: \ program files\ Microsoft visual studio 9.0 \ vc\ include\ stdlib.h (371): see declaration of 'exit
ولی VC6.0 و 2003 تا 2005 این اشکال پیش نمیآید.
نکته 2
اگر برنامهای در حال اجرا باشد و شما کد آنرا تغییر دهید، هنگام کامپایل و پیوند مجدد، خطای پیوند زیر را دریافت میکنید. برای اجتناب از این خطا، ابتدا اجرای برنامه را ببندید و سپس آنرا مجددا کامپایل کنید.
LINK : fatal error LNK1104: cannot open file "Debug/YourProgram.exe"
نکته 3
تمام آنچه شرح دادیم در نسخههای مختلف Visual Studio با قدری تغییر قابل انجام است. البته کار با VC++6 کاملا متفاوت است و بسیار سادهتر میباشد. همچنین دقت کنید که در VC6 پروژهها در مسیر زیر ایجاد میشوند:
C:\Program Files\Microsoft Visual Studio\MyProjects
نکته 4 برای ویندوز 7
در این ویندوز نصب سه فایل glut باید در مسیرهای زیر صورت گیرد:
| glut32.dll | C:\Windows\SysWOW64 |
| glut32.lib | C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib |
| glut.h | C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include |
اگر در ویندوز 7 پیغام وقوع نقص[7] در ساخت پروژه دریافت میکنید، برنامه ویژوال استودیو را ببندید و دوباره آنرا با کلیک راست روی شمایل آن و انتخاب گزینه Run as Administrator اجرا کنید. سپس پروژه خود را بسازید.
نکته 5
برای آموزش تصویری می توانیداینجا را برای ویژوال استودیوی ورژن 6 (98) ، اینجا را برای ویژوال استودیوی 2005 و اینم آموزش فارسی برای ویژوال استودیوی 2008 این فایل و این یکی و برای ویژوال استودیوی 2010 اینجا را ببینید. برای اجرا در لینوکس و مکینتاش هم اینجا. اینم آموزش فارسی برای نصب تحت لینوکس
موفق باشید تا پست بعدی که سر فصل درس ها رو می ذارم ![]()
جونم براتون بگه که:
شرکت مایکروسافت مجموعهای از واسطهای برنامه نویسی کاربردی[1] (API ها) به نام DirectX را برای ارائه دسترسی «مستقیم[2]» به سخت افزار در محیط سیستم عامل ویندوز فراهم نموده است. میدانیم در ویندوز برخلاف داس[3]، کاربر دسترسی مستقیم به سخت افزار ندارد؛ بنابراین DirectX قابلیت بسیار خوبی برای ایجاد کنترل شده این دسترسی مستقیم میباشد. این توابع شامل پشتیبانی از گرافیک دو بعدی و سه بعدی، کنترل هزاران وسیله ورودی، توابع مخلوطسازی و نمونهبرداری صدا و موسیقی خروجی، کنترل بازیهای شبکهای و چندکاربری و کنترل قالبهای گوناگون جریان چند رسانهای میباشند. مؤلفههایی که راه اندازی این کارکردها را بر عهده دارند، عبارتند از :
Direct Draw
Direct 3D
Direct Input
Direct Audio (شامل sound و music )
Direct play
Direct show
هدف مایکروسافت از ارائه DirectX ، ارائه یک راه حل چند رسانهای سریع، مستقل از وسایل و سرشار از قابلیتهای گوناگون برای سیستم عامل ویندوز بوده است که از فناوری [4]COM به عنوان واسط استفاده میکند. لازم به ذکر است که اکثر بازیهای تحت ویندوز نیز امروزه با کمک این ابزار ساخته میشوند [OpenGL Game programming] . امّا در کنار تمامی این محاسن، نکتههایی وجود دارند که در ادامه به آنها اشاره مینماییم و همین نکات، آموزش درس گرافیک رایانهای را در دانشگاههای معتبر دنیا به سوی بکارگیری ابزار دیگری سوق دادهاند که OpenGL نام دارد.
OpenGL یک واسط نرمافزاری برای سختافزار گرافیکی است. به عبارت دیگر، OpenGL یک کتابخانه گرافیکی باز سه بعدی و مدلسازی است که کاملاً قابل حمل و بسیار سریع میباشد. این واسط، توسط شرکت سیلیکون گرافیک[5] (SGI) ابداع شده است. باید دقت داشته باشیم که OpenGL زبان برنامه نویسی نیست بلکه یک API شامل مجموعهای در حدود 700 تابع پیش ساخته است که میتوانیم با فراخوانی آنها تحت اکثر زبانها[6] (از جمله C++/C،Visual C++ ، C#، Visual Basic، Delphi، Java وحتی Assembly ) و اکثر سیستم عاملها[Mac OS, Widows، Linux [7 اشیای گرافیکی را تولید کنیم، اعمال گرافیکی را انجام دهیم و برنامههای کاربردی سه بعدی و محاورهای بسازیم. [redbook و superbible].
به همین دلیل OpenGL در اکثر ابزارهای طراحی به کمک کامپیوتر، ابزارهای مرتبط با معماری ساختمان و مدلسازی هیولاهای ساخته کامپیوتر برای فیلمها بکار میرود [red book]. نرمافزارهای ریاضی Mathematica ، Matlab ، برنامههای صنعتی Working Model 3D ، ANSYS و دایناسورهای فیلم پارک ژوراسیک[8] و بسیاری از محافظهای صفحه نمایش[9] کاربردهای OpenGL هستند [نصیری].
بکارگیری OpenGL بر مبنای کتابخانهها و فایلهای سرآیند است، بنابراین الزامی برای تغییر شیوه برنامهنویسی یا آموختن مدل برنامهنویسی تحت یک سیستمعامل خاص (مثلاً Windows Programming) نخواهیم داشت. از آنجایی که کتابخانه اصلی OpenGLکه GL نام دارد فقط به گرافیک پایه یعنی نقطه، خط و چندضلعی میپردازد؛ بنابراین کتابخانههای دیگری نیز در کنار آن توسعه یافتهاند تا قابلیتهای آنرا گسترش دهند؛ این کتابخانهها را در زیر معرفی میکنیم:
· کتابخانه سودمند[OpenGL (GLU) [10
علاوه بر قابلیتهای GL شامل توابع سطح بالاتر برای پشتیبانی از فنون پرداخت پیشرفته میباشد. ویژگیهایی که این کتابخانه پشتیبانی میکند عبارتند از :
-مقیاسدهی تصاویر دو بعدی
- پرداخت اشیای سه بعدی دارای معادلات درجه چهارم[11] شامل کره، استوانه، دیسک و تکه دیسک
- تولید خودکار mipmap از یک تصویر
- پشتیبانی از منحنیها و سطوح NURBS
- مفروش سازی[12] چند ضلعیهای غیر محدب
- تبدیلات و ماتریسهای خاص
اگر برخی از این مفاهیم را نمیدانید، نگران نباشید بزودی با هم آنها را میآموزیم [OpenGL game prog].
· جعبه ابزار سودمند[OpenGL (GLUT)[13
از آنجایی که OpenGL مستقیماً از پنجره سازی، منوها و ورودی (صفحه کلید، ماوس و دسته فرمان بازی[14]) پشتیبانی نمیکند؛ بنابراین جعبه ابزار سودمند OpenGL یعنی GLUT توسعه یافته است که علاوه بر قابلیتهای GL و GLU از این موارد نیز بصورت مستقل از بستر[15] پیادهسازی پشتیبانی میکند. بنابراین فقط کافی است برنامههای ما شامل فایل سرآیند این کتابخانه باشند.
ویژگیهای این کتابخانه عبارتند از:
- مقداردهی اولیه اجرای GLUT و تنظیم مد نمایشی درون پنجره
- مدیریت پنجرهها (اندازه و مکان پنجره نسبت به صفحه مانیتور)
- پس فراخوانی[16] تابع نمایش صحنه و اجرای برنامه
- اداره رخدادهای ورودی (تغییر اندازه پنجره، فشردن کلیدهای صفحه کلید و ماوس و حرکت ماوس)
- مدیریت یک فرایند پس زمینهای
- ترسیم اشیای سه بعدی (شامل کره، مخروط، چندوجهیهای معروف، چنبره[17] یا تیوب و قوری)
یادگیری و بکارگیری GLUT آسان است و گرچه تمام کارکردهای سیستم عامل را برای ما فراهم نمیکند ولی برای برنامههای کاربردی ساده مناسب است [ OpenGL Game prog].
علاوه بر کتابخانههای فوق، گسترشهای[18] OpenGL دائماً در حال توسعه میباشند. همچنین نسخههای جدید OpenGL دائماً درون کارتهای گرافیک تعبیه میگردند (آخرین نسخه OpenGL در ابتدای سال 2011 نسخۀ 4.1 بوده است).
با توجه به مباحث فوق، احتمالاً تاکنون دریافتهاید که از دیدگاه دانشگاهی که هدف آن بکارگیری ابزار با هدف آموختن روش طراحی و مهندسی آن برای توسعه علم و دانش است، OpenGL نسبت بهDirectX دارای مزایای زیر است :
- باز و رایگان میباشد (توسعۀ آن انحصاری نیست و فاقد کپی رایت است).
- مستقل از بستر است (تحت سیستم عاملها و زبانهای مختلف برنامهنویسی قابل بکارگیری میباشد).
- نمونه کدها و منابع یادگیری گستردهتری از آن در دسترس است (که بسیاری از آنها نیز رایگان است).
- به سخت افزار نزدیکتر است (دید مهندسی بهتری به ما میدهد).
- یادگیری آن و برنامهنویسی با آن آسان است (فقط شامل فراخوانی توابعی با اسامی مناسب میباشد و اطلاعات پیش نیاز لازم ندارد).
منصفانه است بگوییم معایب OpenGL نسبت به DirectX عبارتند از:
- هسته اصلی آن یعنی GL فاقد امکانات ورودی/خروجی است (البته این نقیصه با بکارگیری GLUT برطرف میگردد).
- صرفاً گرافیکی است و از صوت پشتیبانی نمیکند (برای بکارگیری صوت باید از کتابخانههای کمکی همچون fmod یا OpenAL استفاده کنیم).
- گسترشهای آن متفاوت است و کارتهای گرافیکی مختلف گسترشهای مختلفی را پشتیبانی میکنند. بنابراین کارت گرافیکی یک شرکت ممکن است فاقد گسترشهای شرکتهای دیگر باشد و بنابراین برخی امکانات OpenGL را پشتیبانی نکند (این نقص اخیرا با اتحاد میان شرکتها در حال برطرف شدن است)
دفعه بعد به روش راهاندازی OpenGL و بکارگیری آن میپردازیم.
[1] Application Programming Interface
[2] direct
[3] DOS
[4] Component Object Model
[5] Silicon Graphics Incorporation
[6]و7 سایت http://nehe.gamedev.net را ببینید.
[8] Jurassic Park
[9] screen saver
[10] openGL Utility
[11] quadrics
[12] tessellation
[13] open GL Utility Toolkit
[14] joystick
[15] platform
[16] callback
[17] torus
[18] extensions
امیدوارم حالتون خوب باشه
مهمترین منابع کمکی درس گرافیک کامپیوتری عبارتند از:
Richard S. Wright Jr., Benjamin Lipchak,et al, OpenGL SuperBible, 3rd,4th,5th,
Sams, 2005, 2007, 2010
واقعا یکی از بهترین کتاب هاست و با دید پیاده سازی کار کرده که لینک دانلود هر سه ویرایش به ترتیب عبارتند از:
ویرایش سوم بصورت فایل chm مشابه فایل help ویندوز هست و میشه دستورات opengl رو براحتی توش جستجو کنیم
کافیه توی قسمت search نام دستور رو بنویسیم و از میان نتایجی که میاره روی Reference کلیک کنیم
ویرایش چهارم مشابه ویراست سوم هست ولی همه برنامه ها بجای C توی ++ C و شئ گرا هستند
و بهینه سازی شدن
ویرایش پنجم به کلی فرق کرده و بیشتر به مباحث shader می پردازه و از فایلهای خاص lib که خود نویسنده تهیه کرده استفاده می کنه . بنابراین مدل برنامه هاش با برنامه های دیگه opengl خیلی فرق داره. اینم پسوردش : turumtay.mihanblog.com
لینک دانلود برنامه های هر ویرایش رو هم به تفکیک از اینجا بگیرین خیلی خوبه
کتاب بعدی به کتاب قرمز یا redbook معروفه چون جلدش قرمزه ، مطالب رو ساده و جمع و جور گفته
Dave Shreiner, OpenGL Programming Guide (The Redbook), 7th, Addison-Weseley, 2010
لینک دانلود جدیدترین ویرایش
پیوست های کتاب رو هم از اینجا بگیرین
اینم لینک دانلود برنامه هاش
این کتابها هم واسه کارای پیشرفته خوبن با پسورد : turumtay.mihanblog.com
opengl graphics through application
advanced computer graphics using opengl
چند تا سایت هم معرفی می کنم
سایت اصلی opengl که مرجع همه دستورات و راهنماییها و نسخه های جدیده
این سایتهم بعضی کتابهای معروف رو بصورت آنلاین داره
هم یه مرجع کامل آموزش و برنامه نویسی با برنامه های نمونه هست سایت این
خب همگی موفق باشین تا پست بعدی که آشنایی با دلایل بکارگیری ابزاری به نام
هستopengl
وقت همگی بخیر
امروز براتون لینک دانلود مراجع درس گرافیک کامپیوتری رو می گذارم
برای دیدن فایلهای با فرمت djvu می تونین نرم افزار djvu reader رو بصورت رایگان دانلود کنین
مثلا از اینجا
خب اینم اسم و لینک دانلود کتابها:
Donald Hearn and M. Pauline Baker, Computer Graphics , 2nd (c version), 3rd (with opengl), Prentice Hall, 1994, 2004
ویرایش دوم دانلود
ویرایش سوم فقط چهار فصل اول ولی رنگیه
فصل اول فصل دوم فصل سوم فصل چهارم
ویرایش چهارم این کتاب هم سال 2010 چاپ شده ولی هنوز هیچ لینکی ازش نیافتم
Francis .S. Hill, JR., Computer Graphics ,Prentice Hall, 1990
ویرایش دوم و سوم این کتاب هم (Using Opengl) به ترتیب در سال 2001 و 2008 چاپ شده
ولی لینکی ازشون نیافتم
Edward Angel, Interactive Computer Graphics with OpenGL
A Top-Down approach Using OpenGL, 5th, Prentice Hall, 2008
James D. Foley,et al., Introduction to Computer Graphics, Addison-Weseley, 1993
James D. Foley,et al., Computer Graphics:Principles and Practice, Addison-Weseley, 1990
تا اینجا منابع اصلی درس بود که وزارت علوم گفته
منابع کمکی رو هم دفعه دیگه می گذارم
راستی اگه لینکی خراب شد یا شما لینکی از کتابهایی که من پیدا نکردم یافتین لطفا برام توی نظرات ارسال کنین
سلامت باشین عزیزان
تعریف
فرآیند ایجاد، ویرایش و ذخیرهسازی اشیای هندسی و سپس چیدن آنها با بکارگیری روشهای واقعیسازی صحنه را گرافیک رایانهای مینامیم.
موضوع
با توجه به تعریف فوق، مفاهیم تصویر، ابزارهای سازنده تصویر، ویدئو و انیمیشن، نویسه[1]ها، ویرایشگرها، برنامهنویسی گرافیگی و مطالعات درباره این موارد همگی مرتبط با علم گرافیک رایانهای میباشند
[1] character
هدف
یادگیری گرافیک رایانهای فواید زیر را در پی خواهد داشت :
الف) آشنایی با روش کار ابزارهای ورودی و خروجی در راستای تولید صحنه گرافیکی و واسط کاربر آن
ب) آشنایی با الگوریتمهای هندسی و روشهای تولید اشیا
ج) افزایش دید طراحی سه بعدی و قدرت تجسم
د) انجام مقدمات ساخت بازی رایانهای و کسب تواناییهای اولیۀ تولید بازی
علاوه براینها در گرافیک رایانهای میتوانیم به بهترین شکل ممکن که همان تصویر است، نتیجۀ عملکرد خود را ببینیم و در نتیجه انگیزه فعالیت برای خلق تصاویر موجود در ذهن و خیال خویش را پیدا کنیم. این انگیزه نه تنها در تسریع یادگیری مفید است که بسیار لذت بخش نیز میباشد. بدین ترتیب یکی از اهداف یادگیری این علم، تفریح و لذت بردن از صحنههایی است که میسازیم.
بخشها
از تعریف، واضح است که گرافیک رایانهای شامل دو بخش اساسی میباشد:
الف) مدلسازی[1] : شامل خلق و طراحی اشیای هندسی، ویرایش و ذخیرهسازی آنها است. به عبارت دیگر به معنای بیان مشخصههای ریاضی و خصوصیات اشیا برای ذخیرهسازی آنها است . مباحث مدلسازی از اولیههای[2] آشنا همچون نقطه، خط، منحنیهای باز و بسته، چند ضلعیهای محدب و مقعر آغاز میشوند و تا اشیای سه بعدی مانند رویهها، کره، استوانه، مخروط، منشور، هرم و امثال آنها و نیز فراکتالها و نویسهها ادامه مییابند.
مدلسازی اشیا بنا به کاربرد آنها، روشهای گوناگونی دارد که به مدلسازی چند ضلعیها، نمونهگیری پارامتری، روش سلسله مراتبی، هندسه اجسام سازنده ، شمارش فضایی، درختهای چهارتایی و هشتتایی، گلولهها[3] و ابرگویها[4] و زیرتقسیم بندی می توان اشاره نمود.
[1] modeling
[2] primitives
[3] blobs
[4] meatballs
ب) پرداخت(محاسبه تصویر)[1]: شامل روشهای واقعیسازی تصویر و ایجاد صحنه گرافیکی است.
اغلب روشهای واقعیسازی صحنه، به پردازشهای سنگین محاسباتی نیاز دارند تا بتوانند صحنه را برای بیننده جذاب و واقعی جلوه دهند. موضوعات پرداخت صحنه از حذف و برش خطوط و سطوح مخفی، پرکردن و رنگ آمیزی اشیا، ایجاد دورنمای[2] آنها (مناظر و مرایا) آغاز میشوند و نورپردازی، ایجاد بازتاب، خلق سایه، روشهای سایه زنی، اثر بجامانده از حرکت، انواع نگاشت (بافت، محیط و برجسته) را نیز دربر میگیرند.
و) هنر رایانهای
ز) سرگرمی (بازی و پویانمایی و فیلم سازی)
ح) طراحی واسط گرافیکی کاربر[1] (GUI)
[1] Graphics User Interface
ط) پردازش تصویر
ی) واقعیت مجازی
در پست بعدی مهمترین مراجع درس گرافیک کامپیوتری (گرافیک رایانه ای) رو به همراه لینک دانلود براتون
می گذارم.
آخرین روز تعطیلات خوش بگذره
سال نو بر همه شما دوستان گرامی مبارک
از آقای غریبی عزیز بسیار متشکرم که این فرصت رو بهم دادند تا بتونم اطلاعات خودم رو از طریق این وبلاگ در اختیار شما عزیزان قرار بدم
همچنین از استادان گرانقدری چون دکتر رضا روانی و دکتر آلبرت پوربنیامین و دکتر اعظم باستان فرد که روشنگر این راه برایم بوده اند کمال تشکر را دارم
مطالب خودم رو تقدیم می کنم به همه دانشجوهای خوب دانشگاه علم و فرهنگ و دانشگاه آزاد قزوین و دانشگاه آزاد کرج و سایر دوستانم

