# مباحث متفرقه برنامه نویسی > طراحی و ساخت بازی‌های کامپیوتری > آموزش: [OpenGL] برنامه نویسی گرافیک سه بعدی مدرن

## amin1softco

سلام خدمت تمامی دوستان
در پی استقبال دوستان و عزیزان از تاپیک قبلی و در ادامه اهدافش و صحبتی که با مدیر بخش پویا داشتیم می خواهیم در این تاپیک خیلی منظم به آموزش مرحله به مرحله OpenGL بپردازیم . 
پیشاپیش از همه دوستان خواهش می کنم سئوال , پروژه دانشجویی یا امثالش رو به این تاپیک وارد نکنند و از مدیران هم تقاضا می کنم هر مطلبی که خارج از اهداف این تاپیک زده شد حذف  کنند.

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

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

----------


## amin1softco

فهرست مطالب 



> درباره ی این کتاب
> 
>     چرا باید این کتاب را بخوانیم؟
>     چیزی که شما نیاز دارید
>     سازمان این کتاب
>     کنوانسیون های مورد استفاده در این کتاب
> 
> ساخت آموزش
> I. مبانی
> ...

----------


## amin1softco

*درباره این کتاب* 
سخت افزار گرافیک سه بعدی به سرعت در حال رشد است ,نه تنها به یک جزء عمده سیستم های کامپیوتری است بلکه  یک جزء ضروری این سیستم ها است. بسیاری از سیستم عامل ها به طور مستقیم و حتی ضروری به رندر سه بعدی سخت افزار نیاز دارند. حتی در فضای محاسبات تلفن همراه به طور فزاینده سخت افزار گرافیک سه بعدی یک ویژگی استاندارد برای همه محسوب می شود اما با قدرت و توان کمتر.
درک چگونگی ساخت بیشتر این سخت افزار ها یک چالش سخت است مخصوصاً برای کسانی که تازه با گرافیک و رندر کردن آشنا می شوند.
*
چر باید این کتاب را بخوانیم؟*
بسیاری از کتاب های فیزیکی برای آموزش گرافیک وجود دارد. بسیاری از مخازن آنلاین از دانش وجود دارد، در قالب ویکی، وبلاگ ها، آموزش، و انجمن ها. پس این کتاب چه چیزی ارائه می دهد که دیگران ندارند ؟

برنامه ریزی 
در واقع همه منابع ذکر شده با استفاده از چیزی به نام "تابعی ثابت" به مبتدیان آموزش می دهند. این نشان دهنده پیکربندی در پردازنده های گرافیکی قدیمی است که تعریف می کنند چطور یک عملیات رندر خاص انجام می شه.
به طور کلی ساده ترین راه آموزش به مبتدیان گرافیک کامپیوتری که در نظر گرفته شده استفاده از خط لوله تابع ثابت است.(fixed function pipeline.)
این درست در نظر گرفته شده است زیرا بدست آوردن چیزی که اتفاق می افتد با "تابعی ثابت" آسان است.
ساختن یک تصویر از خلق یک چیز واقی ساده تر است. خط لوله تابع ثابت شبیه چرخ های کمکی برای دوچرخه است.
جنبه های منفی به این رویکرد وجود دارد. اول،بسیاری از مفاهیمی که با این روش آموخته می شود را باید به ناچار رها کند زمانی که کاربر با یک مسئله گرافیکی مواجه می شود که باید بوسیله برنامه ریزی (برنامه نویسی) حل شود. برنامه ریزی (برنامه نویسی) محو می کنه بیشتر خط لوله تابع ثابت بنابر این دانش به سادگی منتقل نمی شه.
مشکل بدتر اینه که خط لوله تابع ثابت می تونه باعث توهم دانش در فرد بشه.
کاربر می تونه فکر کنه که می دونه چیکار داره می کنه ولی در حقیقت فقط کپی و پیست کد های اطرافش است.
برنامه نویسی به این ترتیب می شود شبیه به آیین های جادویی: شما بیت های خاصی از کدتون را قبل از بیت های دیگر قرار می دهید، و همه چیز به نظر می رسد به درستی کارمی کنه.
این امر اشکال زدایی را کابوس مانند می کنه. به این دلیل که کاربر هرگز واقعاً نمی فهمه کدش داره چیکار می کنه .
کاربر نمی تونه تشخیص بده , یک مشکل خاص می تونه باعث چی بشه. و بدون این قابلیت دباگ یا اشکال زدایی می شه یکسری از حدس های احتمالی از قسمتی که مشکل سازه.
در مقابل شما نمی تونید با موفقیت استفاده کنید از یک سیستم برنامه ریزی شده  بدون درک اولیه اون.
مواجهه با گرافیک سخت افزار به معنی مواجه با موضوعاتی است که تابعی ثابت اغلب در حاشیه ازش رد می شه.
این ممکنه به معنی یک استارت آهسته کلی باشه. ولی وقتی شما در نهایت رسیدید به پایان شما به درستی می دونید چطور هر چیزی کار می کنه.


مشکل دیگر این است که حتی اگر شما به درستی خط لوله تابع ثابت را بفهمید و اون  نحوه فکر کردن شما در مورد حل مشکلات را محدود می کنه. به دلیل عدم انعطاف آن, اون ذهن شما را روی حل یکسری مسائل با امکانات خاص  متمرکز می کنه  و بدور از مسائل دیگه.
اون تشویق می کنه شما فکر کنید به بافت ها(textures) مانند یک تصویر; داده های نقاط به عنوان مختصات بافت , رنگ ها یا موقعیت ها و چیز هایی شبیه این. بوسیله ماهیتش اون خلاقیت و توانایی حل مسئله شما رو محدود می کنه.
در نهایت , حتی بر روی سیستم های تلفن همراه تابعی ثابت " fixed functionality" به صورت کلی در سخت افزار گرافیکی در دسترس نیست و این در آینده بیشتر به واقعیت نزدیک می شه.
این کتاب آموزش در سطح مبتدی ارائه می دهد در مورد آنچه که بسیاری آن را یک مفهوم پیشرفته در نظر می گیرند . اون آموزش رندر قابل برنامه نویسی است برای برنامه نویسان مبتدی در گرافیک از ابتدا .
این کتاب همچنین شامل برخی از مواد مهم است که اغلب نادیده گرفته می شود یا جزو مفاهیم پیشرفته در نر گرفته شده. این مفاهیم در واقع پیشرفته نیستند و آنها اغلب بوسیله بیشتر مواد مقدماتی نادیده گرفته می شوند زیرا آنها با خط لوله تابعی ثابت کار نمی کند.

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

این کتاب چی نیست؟ با این حال یک کتاب در گرافیک رابط های برنامه کاربردی می باشد( graphics APIs) در حالی که اون از openGL و ضرورت آموزش  مفاهیم رندر از لحاظ openGL ولی یک کتاب در مورد openGL نیست. هدف این کتاب این نیست که به شما تمام ورودی و خروجی api های openGL را آموزش بده. اینها بخش هایی از توابع و قابلیت های openGL است که ما با اونها برخورد نمی کنیم زیرا به هیچ یک از درس های آموزشی ما مربوط نمی شوند. اگر شما در حال حاضر می دونید گرافیک و دنبال یک کتاب برای یادگیری برنامه نویسی مردن OpenGL هستید این کتاب بدرد شما نمی خوره. ممکنه در اون ظرفیت های مفیدی برای شما موجود باشه اما این کتاب هدف کلیش این نیست.
این کتاب برای این در نظر گرفته شده که به شما بیاموزد چگونه یک برنامه نویس گرافیک شوید.هدفش یک فیلد خاص گرافیکی نیست. اون طراحی شده برای پوشش بیشتر زمینه های رندر سه بعدی . بنابر این اگر شما می خواهید یک توسعه دهنده گیم شوید , یک طراح برنامه cad , انجام چند شبیه سازی کامپیوتری , یا هر چقدر از این ها این کتاب هنوز هم می تواند دارایی برای شما باشد.

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


*شما به چی نیاز دارید؟*
این یک کتاب برای مبتدیان  برنامه نویسی گرافیک  است همچنین می تواند به عنوان یک کتاب برای کسانی که آشنایی با توابع ثابت " fixed functionality" دارند و می خواهند رندر قابل برنامه ریزی بهتری داشته باشند است ولی این کتاب  برای برنامه نویسان مبتدی نیست.
از شما انتظار می رود که قادر به خواندن سی و استدلال کد های سی++ باشید. اگر دانش شما در مورد c/C++‎ برنامه "سلام دنیا!" است. بنابر این قبل از رندر تصاویر گرافیکی شما باید کد های سنگین تری بنویسید.
رندر گرافیک سه بعدی به سادگی برنامه نویسی مبتدی نیست. این فقط در مورد شیوه آموزش سنتی برای گرافیک مدرن کامپیوتری درست است.
این آموزش ها  قابل انتقال به زبان های دیگر نیز هستند. اگر شما می تونید C/C++‎ را بخوانید برای فهمیدن اینکه کد چگونه کار میکند کفایت می کند. همچنین دایکیومنت ها شرح می دهند که کد ها چگونه کار می کنند و برای بدست آوردن اطلاعات برای این آموزش ها کافی است.
هر بحث مهم در مورد رندر سه بعدی نیاز به بحث در مورد ریاضیات دارد که پایه و اساس تمام فیلد های گرافیک سه بعدی است. در این کتاب از شما انتظار میرود  دانش پایه ایی در زمینه علم هندسه و جبر داشته باشید.  در این آموزش ها بیشتر ریاضیات پیشرفته که برای گرافیک ضروری هستند ارائه شده اما شما باید دانش حداقلی در زمینه هندسه و جبر داشته باشید جبر خطی نیاز نیست هر چند که مفید خواهد بود.
کد آموزش های این کتاب از openGL به عنوان  API رندر کننده استفاده کرده است. شما نیازی به دانستن openGL ندارید ولی برای اجرای کد ها شما باید یک محیط برنامه نویسی که اجازه اجرای کد های openGL را بده نیاز دارید. مخصوصاً شما نیاز به سخت افزاری که قادر به اجرای openGL نسخه 3.3 است دارید. بوسله  تمام کار ت های GeForce 8xxx یا بهتر و یا هر Radeon HD-class card. این ها همچنین کارت های "Direct3D 10" نامیده می شوند ولی شما به ویندوز 7 یا ویستا برای استفاده از قابلیت های پیشرفته اونا بوسیله openGL ندارید.

اداممه دارد....

----------


## f_talebi

میشه ادامه بدین لطفا

----------


## amin1softco

دوستان این ترجمه که ضمیمه این پست شده چند صفحه از بخش 5 همین کتاب است لطفاً مشکلات ترجمه را به من گوشزد کنید. سعی میک نم فصل 14 که در مورد بافت ها هست را تکمیل کنم و هفته آینده این پست را آپدیت کنم .
بعضی از دوستان هم از نحوه کامپایل برنامه های این آموزش سوال کرده بودند که باید بگم ابتدا فایل premake را باید دانلود کنید و در پوشه ویندوز کپی بزنید برای ویژوال 2010 در ویندوز اینجوری می شه : 
1- ابتدا وارد صفحه کامندپارامتر شده start->run->cmd->ok
رفتن به شاخه glsdk : 

c:
cd Tutorial 0.3.8
cd gldsk
premake4 vs2010

2- بعد *re*build کردن پروژه در vs2010
3- رفتن به شاخه اصلی پروژه Tutorial 0.3.8 و premake4 vs2010
4- اجرای و *re*build پروژه در vs2010  (کلیک راست رو کل پروژه یا زدن کلید ctrl+alt+F7)
5- راست کلیک روی Tut 01 MainD و انتخاب set as start up project
6- اجرا کردن با کلید F5 
در ضمن باید حتماً درایور openGL ورژن 3.3 باشه وگرنه اجرا نمی شه !!!
موفق باشید.
لینک مستقیم دانلود آموزش

----------


## amin1softco

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

----------


## amin1softco

این کتاب یادگار خدمت است من و کامران رستمی این کتاب را ترجمه کردیم بخش 4 تا آخر این کتاب که ضمیمه شد بیش از 120 صفحه ;)

----------


## amin1softco

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

----------


## fatemeh.teh

سلام دوستان

من میخوام یه برنامه با shape درست کنم  اما وقتی dll اونو اد میکنم  چنین اروری میده وکسی میدونه مشکل چیه؟؟
Capture.PNG

----------

