آشنایی با گرافیک کامپیوتری

در این مقاله قصد داریم تا شما عزیزان را با گوشه ای از کاربردهای متنوع کامپیوترها یعنی مقوله جذاب گرافیک کامپیوتری آشنا کنیم. در این فرصت کوتاه سعی میکنیم با هم نگاهی هر چند گذرا بر مبانی گرافیک کامپیوتری بیاندازیم و از این رهگذر دیدی جدید بر بخشهای دیگری از صنعت نرم افزار همچون بازیها، شبیه سازیها و نرم افزارهای چند رسانه ای پیدا کنیم.
در دهه نود (CG (Computer Graphics نام اختصاری تکنیکی بود که امروزه ما آن را بنام گرافیک کامپیوتری میشناسیم. اصولا وقتی صحبت از گرافیک در کامپیوتر به میان می آید با دو مسئله روبرو هستیم، گرافیک دو بعدی و گرافیک سه بعدی. البته الان دیگر به لطف کارتهای گرافیکی سریع که از قابلیتهای سه بعدی به بهترین شکل پشتیبانی میکنند، گرافیک دو بعدی جایگاه خود را از دست داده است، ولی برای کامل شدن بحث ناچاریم عناصر اصلی سازنده گرافیک دوبعدی را هم یاد آور شویم.
شاید بتوان گفت تصاویر بطور کلی مهمترین عنصر گرافیک دو بعدی را تشکیل میدهند. از جمله مهمترین فعالیتهایی که در گرافیک دو بعدی انجام میگیرد، خواندن، نمایش، تغییر موقعیت، تغییر اندازه، چرخش و فیلتر کردن یک تصویر میباشد. این تصویر میتواند یک فایل بر روی کامپیوتر باشد (مثلا با فرمت jpg یا bmp) یا میتواند مستقیما در برنامه و توسط کد نویسی تولید شود. به هر صورت سخت افزارهای گرافیکی که تا قبل از سال 95 در بازار موجود بودند، عمدتا بر روی این قابلیتها تمرکز داشتند. بعنوان نمونه، الان تقریبا همه کارتهای گرافیکی (چه دو بعدی و چه سه بعدی) دارای بخشی ویژه برای رسم تصاویر در صفحه میباشند. عملیات blit – که مخفف کلمات bit-block transfer (به معنای انتقال تکه ای از بیتها) میباشد – به نوعی هسته مرکزی فعالیتهای یک کارت گرافیکی در حالت دو بعدی را میسازد. همچنین بسیاری از سخت افزارها دارای چیپ ویژه ای جهت کشیدن و جمع کردن تصاویر میباشند. این تکنیک که image stretching نام دارد در برنامه های سه بعدی هم کاربرد فراوانی دارد. از جمله بخشهای مهم گرافیک دو بعدی میتوان به فونتها برای رسم مطالب بر روی صفحه اشاره کرد. فونتها هم اغلب توسط تصاویر نمایش داده میشوند. از دیگر فرآیندهایی که در هنگام کار با تصاویر انجام میگیرد، ماسک کردن بخشی از تصویر میباشد، تا به این شکل بتوان جلوه های ویژه متعددی را ایجاد کرد. این تکنیک که امروزه در گرافیک سه بعدی هم کاربرد فراوانی دارد، در بخش گرافیک سه بعدی بطور مفصلتری بررسی خواهد شد. اگر بخواهیم نمونه هایی گویا از برنامه های گرافیک دو بعدی را مثال بزنیم، میتوانیم به بازیهای دهه هشتاد و نود اشاره کنیم؛ در آن زمان تقریبا اکثر بازیها دو بعدی بودند و همگی بر یک اصل استوار بودند: نمایش تصاویر ثابت به شکل پشت سر هم بطوری که حرکت را القاء کند. نهایت هنری که میتوانستند به خرج دهند ایجاد صحنه هایی مثل انفجار، بارش باران یا انعکاس نور البته در حد بسیار ابتدایی بود که این کارها عمدتا توسط تصاویر از پیش آماده شده انجام میگرفت. با ورود کارتهای جدیدتر و با قابلیتهای سه بعدی بالا، اگرچه بسیاری از خصوصیات گذشته حفظ و حتی تقویت شد، ولیکن عناصر جدیدی به این جمع اضافه گشت.
به جرات میتوان گفت گرافیک سه بعدی بر مبنای گره ها و چند ضلعی ها (polygon) بنا شده است. در واقع گره ها (vertex) در گرافیک سه بعدی حکم اعداد در ریاضی را دارند. هر کاری که بخواهیم انجام دهیم به نوعی به گره ها مربوط میشود. آنها هستند که اشیاء ما را میسازند، در نورپردازی ها استفاده شده و بافت زنی میشوند. حتی میتوان با انتقال آنها در فضای سه بعدی تصاویر متحرک را نیز به آسانی بدست آورد.
اگر با یک نرم افزار خلق اشیاء سه بعدی همانند MAX کار کرده باشید، حتما با خیلی از این واژه ها آشنایی دارید؛ ولی اگر هم تا به حال به سراغ این برنامه ها نرفته اید، مهم نیست. در اینجا همه این عبارات را مرور خواهیم کرد و خودتان در نهایت متوجه میشوید که گرافیک کامپیوتری (بخصوص گرافیک سه بعدی) چه عرصه جذابی است، شاید پس از خواندن این مقاله با جدیت بیشتری گرافیک در کامپیوتر را دنبال کنید.
شاید تا حالا واژه رندر (render) را زیاد شنیده باشید، این عبارت در کل به معنای خلق تصاویر دو بعدی از اشیاء سه بعدی بر روی صفحه کامپیوتر میباشد.
از گره شروع میکنیم تا ببینیم اشیاء سه بعدی که در صفحه مانیتور میبینم واقعا از چه چیزی تشکیل شده اند. یک مکعب را در نظر بگیرید. مکعبها هشت گوشه دارند که این هشت گوشه خود شش وجه میسازند. هر یک از وجوه (که در اصطلاح به آنها face گفته میشود) یک مربع هستند. و میتوان گفت که هر مربع از کنار هم قرار گرفتن دو مثلث تشکیل شده است. پس در واقع هر مکعب از 12 مثلث هم اندازه ساخته شده است. در گرافیک کامپیوتری، به گوشه های سازنده اشیاء گره (vertex) گفته میشود. لبه های اشیاء هم که گوشه ها را به هم متصل میکنند edge (یا همان لبه) نامیده میشوند.

بطور کلی به صفحات سازنده اشیاء، چند ضلعی (polygon) گفته میشود ولی از آنجایی که سخت افزارهای گرافیکی در حقیقت فقط میتوانند سه عنصر نقطه، خط، و مثلث را رسم کنند باید گفت که حتی پیچیده ترین سطوح – از یک مربع ساده گرفته تا یک نوار موبیوس – از مثلثها تشکیل شده اند. یک نکته مهم در مورد کارت های گرافیکی این است که آنها به هیچ وجه قادر نیستند بطور مستقیم منحنی رسم کنند، و حتی چند ضلعی های بیشتر از سه گوش را هم عملا نمیشناسند. نکته مهم دیگر این که هم صفحه بودن در گرافیک کامپیوتری بسیار با اهمیت میباشد، و از این رو تنها سطحی که سخت افزارهای سه بعدی قادر به رسم مستقیم آن هستند، مثلث میباشد. عملیات شکستن سطوح منحنی به مثلثهای کوچک، tessellation نامیده میشود که این روزها در برنامه های گرافیکی بعنوان یک قابلیت مهم تلقی میشود. در واقع اصطلاح Higher Order Primitive (اشیاء سطح بالا) به اشیائی اشاره دارد که هم صفحه نیستند، مثلا سطوح درجه دو یا منحنی ها. اگرچه ممکن است خیلی برنامه ها آنها را تنها با گرفتن چند ورودی از شما بر روی صفحه رسم کنند، ولی چیزی که اتفاق می افتد با چیزی که شما بر روی تصویر میبینید اندکی فرق میکند. بسته به وضوح صفحه، فاصله شیء از شما و توان گرافیکی سیستم، سطوح منحنی بر طبق محاسبات پیچیده و سنگین به یک سری مثلث کوچک تبدیل میشوند. هر چه در یک محل تعداد این مثلثهای کوچک بیشتر باشد منحنی شما هموارتر به نظر میرسد.


از سایر ویژگی های اشیاء سه بعدی باید به قابلیت آنها برای دریافت نور و در نتیجه داشتن رنگ اشاره کرد. بدون نور هیچ چیز قابل رویت نمیباشد و اگر هم بتوان اشیاء را دید، نهایتا به شکل کاملا تخت و دو بعدی میسر خواهد بود. هنگامی که اشیاء موجود در یک صحنه را رسم میکنید باید به نحوه نورپردازی هم کاملا فکر کنید، زیرا زیباترین اشکال سه بعدی بدون وجود نور مناسب جلوه خوبی نخواهند داشت. در واقع دو مبحث نور و رنگ ارتباط تنگاتنگی با هم دارند؛ رنگ، دریافت چشمان ما از نوری است که به سطوح برخورد کرده و انعکاس می یابد. نور هم مجموعه ای از فوتونهاست که با برخورد به سلولهای مخروطی چشمها، آنها را تحریک میکند. حالا بار دیگر به مثال مکعب بازمیگردیم، همانطور که در طبیعت همه اشیاء دارای سطح و رنگ مخصوص به خود میباشند، اشکال سه بعدی درون صفحه کامپیوتر هم باید دارای ویژگی خاصی باشند که نوع واکنش آنها در مقابل نور را مشخص کند. در اصل، خصوصیات سطحی هر جسم ماده آن جسم نامیده میشوند. ماده یا material میتواند نشانگر رنگ نهایی یک جسم در حالتی باشد که نورپردازی اعمال میشود. شما میتوانید بسته به نیاز، از نورپردازی استفاده نکنید و تنها از رنگهای ثابت برای اشیاء بهره ببرید. از نکات مهم دیگر نحوه سایه زنی اشیاء است، برای اینکه این ویژگی را بهتر متوجه شوید به دو شکل زیر توجه کنید:

به نظر شما چه تفاوتی میان دو قوری بالا وجود دارد؟ در تصویر سمت چپ هر یک از سطوح سازنده قوری، دارای یک رنگ ثابت بوده و همین مسئله باعث میشود که سطح جسم به شکل نسبتا تخت دیده شود. این شیوه، سایه زنی تخت (flat shading) نام دارد. در این روش هر سه گره سازنده یک مثلث دارای یک رنگ نهایی میباشند. ولی در تصویر سمت راست، ظاهر کاملا هموار قوری مشخص است، توجه داشته باشید که این دو شیء از لحاظ هندسی کاملا مشابه میباشند ولیکن به خاطر نوع سایه زنی، قوری سمت راست دارای سطحی هموار میباشد. در این روش که به سایه زنی هموار (smooth shading) معروف است، رنگ گره ها بر حسب موقعیت میانیابی میشود و بدین ترتیب ممکن است گره های سازنده یک مثلث هر یک رنگ مخصوص به خود را داشته باشند، و سطح مثلث هم دارای یک شیب رنگی خواهد بود. (این شیوه gouraud shading هم نامیده میشود) به هر ترتیب استفاده از این گزینه کاملا به نوع برنامه بستگی دارد، ولی باید توجه داشت که معمولا تکنیکهایی که ظاهری زیباتر و هموارتر را بوجود می آورند به میزان محاسبات بیشتری نیاز داشته و بنابراین سرعت اجرای برنامه را پایین می آورند.
یکی از مواردی که در حین ساخت اشیاء سه بعدی باید مد نظر قرار گیرد این است که اگر قرار است آنها تحت نورپردازی قرار گیرند، باید ویژگی های خاصی داشته باشند. مهمترین نکته، وجود بردارهای خاصی به نام بردار نرمال(normal vector) برای هر گره میباشد. این بردارها، همانطور که از نامشان پیداست با توجه به جهتی که قرار است شیء نسبت به منبع نوری داشته باشد بر گره عمود میباشند. در محاسبات نورپردازی، زاویه بین منبع نوری و سطح اشیاء (که تعیین کننده میزان نور دریافتی هر سطح میباشد) توسط همین بردار نرمال تعیین میشود. برای اینکه مبحث نور را به پایان ببریم، لازم است نکته ای هم راجع به انواع منابع نوری بگوییم. بطور کلی نورها در طبیعت به سه دسته تقسیم میشوند. نورهای نقطه ای که برای مثال میتوان از یک لامپ معمولی نام برد. این نورها دارای موقعیت و جهت مشخص میباشند و قادر هستند که محدوده ای مشخص از اطراف خود را روشن کنند. نوع دیگر نورهای موازی میباشند که به علت دور بودن بیش از حد منبع ساتع کننده از بیننده، هیچ موقعیتی را نمیتوان برای آنها ذکر کرد. آنها تنها جهت دارند و خورشید بهترین مثال از این نوع است. دسته آخر منابع نوری، نورهای پروژکتوری میباشند که در واقع حالت خاصی از نورهای نقطه ای هستند. تنها تفاوت این دو دسته این است که نورهای پروژکتوری (یا نورهای لکه ای) همه محیط اطراف خود را به یک شکل روشن نمیکنند، بلکه همانند یک نورافکن، ناحیه ای مخروط وار را نورپردازی میکنند. از جمله خصوصیات مشترک همه نورها، رنگ، شدت و ضریب رقیق شوندگی نور بر حسب فاصله تا منبع نوری است. شاید بتوان گفت بیش از نیمی از تکنیکهای ویژه گرافیک کامپیوتری به مسئله نورپردازی مربوط میشوند، از این رو این بخش از گستردگی زیادی برخوردار است و میتوان با تغییر ماده سطح، رنگ نور، و رنگ گره ها هزاران جلوه بصری زیبا را خلق کرد.
یکی دیگر از مباحثی که به شکل روز افزونی در گرافیک سه بعدی مطرح میشود، مسئله بافت سطوح میباشد. بافت یا texture در واقع تصویری دو بعدی است که به شکلی خاص بر روی سطوح و اجسام سه بعدی نگاشته میشود تا به آنها ظاهری واقع گرایانه تر بدهد. مثلا فرض کنید میخواهید یک دیوار آجری را نمایش دهید، بدین منظور تنها کافی است تصویری از یک دیوار آجری را (که ممکن است از اینترنت پیدا کرده باشید یا از روی یک عکس اسکن نموده باشید) بر روی یک سطح مستطیل مانند بنگارید. به این ترتیب یک دیوار آجری زیبا دارید که تنها از یک مستطیل (که خود از دو مثلث ساخته شده) تشکیل شده است و روی آن یک عکس قرار دارد. با استفاده از بافتها میتوان جلوه های بسیار زیبایی بوجود آورد.

با ریاضیات چطور هستید؟ آیا تا به حال فکر کرده اید چطور میتوان اشیاء را در فضای سه بعدی حرکت داد؟ یا چطور میتوان ظاهر کاملا پرسپکتیوی که در بازیها وجود دارد را ایجاد نمود؟ این مباحث اندکی به دانش ریاضی نیاز دارند. در واقع باید گفت مباحث جبر خطی. حتما میدانید یک ماتریس چیست. ماتریسها آرایه های دو بعدی از اعداد هستند که میتوانند برای انجام بسیاری محاسبات پیچیده بکار روند. در گرافیک سه بعدی ماتریسها حکم مفاصلی را دارند که سایر بخشها را به هم متصل میکنند؛ از جمله کاربردهای آنها تعریف یک محوطه دید(viewport) برای نمایش اشیاء است. همچنین میتوان به کمک آنها تبدیلات گوناگونی روی اشیاء سه بعدی انجام داد. انتقال، چرخش، تغییر اندازه، منعکس کردن روی یک سطح (مثلا برای ایجاد سایه) را میتوان از جمله رایج ترین عملیات ماتریسی ذکر کرد که در گرافیک سه بعدی خیلی کاربرد دارند. به کمک ماتریسها میتوانید کلیه خصوصیات یک دوربین پیشرفته را در دنیای واقعی در محیطی مجازی شبیه سازی کنید. مثلا موقعیت، نقطه هدف، نوع لنز، فاصله کانونی و حتی زاویه چرخش دوربین هم کاملا قابل تنظیم میباشد.
بردارها هم از جمله مولفه های پرکاربرد در گرافیک سه بعدی هستند که ارتباط تنگاتنگی با ماتریسها دارند. در واقع در گرافیک سه بعدی، همه مختصات اعم از موقعیت گره ها، بردارهای نرمال، مختصات بافتها (و حتی بنوعی رنگها) بصورت برداری تفسیر میشوند. این بردارها میتوانند یک، دو، سه و یا چهار بعدی باشند.
از دیگر نکاتی که شاید جالب به نظر برسد، میتوان به تفسیر رنگها توسط کامپیوتر اشاره کرد. همانگونه که اشاره شد، چشمان ما برای دریافت نور دارای سلولهای دوکی شکلی هستند؛ چشم انسان دارای سه سلول مخروطی میباشد، که یکی به نور قرمز، یکی به نور سبز و دیگری به نور آبی حساس است. اساس کار سیستمهای رنگی در کامپیوترها هم همین است. یعنی همه رنگها بر اساس ترکیبی از مولفه های قرمز، سبز و آبی ساخته میشوند. واژه RGB هم از حروف اول این کلمات گرفته شده است. معمولا مقدار هر یک از این سه مولفه بین 0 تا 1 میباشد. مثلا در حالتی که هر سه آنها 1 باشند، رنگ سفید و وقتی که هر سه آنها مقدار 0 را دارا باشند رنگ سیاه ساخته میشود. میتوان با تنظیم مقادیر مختلف برای این متغیرها انواع رنگها را ایجاد کرد.
شما بعنوان یک برنامه نویس گرافیکی باید بدانید که کامپیوتر چطور و با چه ترتیبی تصاویر سه بعدی را بر روی مانیتور نمایش میدهد. برای این که بتوانیم تجسمی نسبت به این فرآیند پیدا کنیم، بهتر است یک مثال خیلی ساده را با هم مرور کنیم. یکی از راههای ساخت تصاویر متحرک توسط کاغذ، رسم تصاویری با اختلافات جزئی نسبت به هم بر روی صفحات متوالی کاغذ میباشد، سپس میتوانید با ورق زدن این صفحات، تصاویر متحرکی را مشاهده کنید. در کامپیوترها هم معمولا چنین عملیاتی انجام میگیرد. با این تفاوت که در اینجا به جای چندین صفحه کاغذ، معمولا فقط دو (یا حداکثر سه) صفحه برای رسم تصاویر رنگی در نظر گرفته میشوند. در اصطلاح به این صفحه ها که مسئولیت نگهداری اطلاعات تک تک پیکسلهای صفحه را دارند، بافر (buffer) گفته میشود. بافرهای گوناگونی در گرافیک سه بعدی بکار میروند که میتوان از بین آنها به دو بافر رنگی (color buffer) و بافر عمق اشاره کرد. بافر رنگی غالبا مجموعه ای از دو بافر مجزا به نامهای بافر پشتی و بافر جلویی است. بافر جلویی (front buffer) صفحه ای است که در هر لحظه تصاویر را بر روی صفحه نمایش میدهد. در همین حال که اطلاعات موجود در بافر جلویی بر روی صفحه هستند، برنامه شما در حال ایجاد تغییرات مورد نظر بر روی بافر پشتی (back buffer) است؛ به محض اینکه بافر پشتی آماده نمایش شد، جای این دو بافر عوض میشود(در اصطلاح page-flipping)، این روند تا انتهای اجرای برنامه ادامه دارد و سرعت تعویض این بافرها همان سرعت اجرای برنامه شماست که با واحد فریم در ثانیه (FPS) سنجیده میشود. هر چه این نرخ بالاتر باشد، تصویری هموارتر خواهید داشت. چشمک زدن تصویر (flicker) مشکلی است که غالبا بواسطه پایین بودن نرخ فریم پیش می آید. معمولا نرخ فریمهای بالای 30، مناسب میباشند. بطور کلی هر چه صحنه شما شلوغتر باشد و در آن از تکنیکها و اشیاء بیشتری استفاده کرده باشید نرخ فریم برنامه پایینتر می آید.
بافر مهمی دیگر، بافر عمق میباشد. بافر عمق (depth buffer) که گاهی اوقات بافر z هم نامیده میشود وظیفه تنظیم رنگ نهایی پیکسلهای روی مانیتور را بر عهده دارد. اگر یادتان باشد گفتیم که در گرافیک سه بعدی، همه چیز از یک سری نقاط به نام گره تشکیل شده است، گره هایی که همگی دارای مختصات سه بعدی در فضا میباشند. معمولا سیستمهای مختصاتی که در گرافیک سه بعدی بکار میروند سمت مثبت محور x را جهت راست، سمت مثبت y را جهت بالا و سمت مثبت محور z را رو به بیرون یا داخل مانیتور در نظر میگیرند. با این توضیح، فرض کنید شما در مختصات (10, 15, 5) یک کره رسم کرده اید. این کره قرمز رنگ میباشد. حالا در قسمت دیگری از برنامه نیاز به رسم یک مکعب آبی در مختصات (10, 15, 0) دارید. فرض میکنیم از سیستم مختصات چپگرد استفاده شده باشد (یعنی مختصه z به سمت داخل مانیتور میباشد)، در نتیجه کره قرمز رنگ پشت سر مکعب آبی قرار خواهد گرفت و شما قاعدتا باید تنها مکعب را در آن محل ببینید. تعیین اینکه در هر موقعیت، چه شیئی و با چه رنگی باید روی پیکسلهای صفحه رسم شود، بر عهده بافر عمق میباشد. بافر عمق، پس از ارسال موقعیت گره های هر شیء توسط شما آنها را ذخیره کرده، و در صورت رسم اشیائی دیگر (که احتمالا رنگ متفاوتی خواهند داشت) در موقعیتهای قبلی، مختصه عمق (یا همان z) اشیاء قدیم و جدید را با هم مقایسه میکند. پس از انجام این تست، هر یک از اشیاء که به بیننده نزدیکتر بود میتواند در نهایت پیکسلهای صفحه را با رنگ خود، رنگ آمیزی نماید!
مطالب فوق الذکر اسکلت گرافیک سه بعدی را بنا میکنند، اما همه چیز به آنها ختم نمیشود، و روز به روز، با پیشرفت کارتهای گرافیکی، تکنیکهای ویژه ای عرضه میشوند که البته مبنای اکثر آنها همینهایی است که در بالا گفتیم. برای مثال در مبحث نور و بافت، میتوان علاوه بر نورپردازی های معمولی و نگاشت بافتهای ساده بر روی اشیاء، بسیاری از پدیده های دنیای واقعی را هم شبیه سازی نمود. بعنوان نمونه، میتوان به کمک یک ماتریس خاص و نوع ویژه ای از بافت زنی (texture mapping)، جلوه انعکاس محیط اطراف بر روی اشیاء را پیاده سازی نمود. یا میتوان بافتهای حجمی را برای ایجاد جلوه رنگین کمان یا منشور نوری بکار برد. همچنین میتوان با ترکیب مولفه های رنگی تصاویر، بافتهایی را بر روی اشیاء نگاشت که به نظر برجسته می آیند (این تکنیک bump mapping نام دارد). ایجاد مه و سایر پدیده های اتمسفری هم به راحتی در برنامه های گرافیکی امکان پذیر میباشد. اصولا دو نوع مه وجود دارد، یکی مه پیکسلی (table fog) که بصورت جدولی از پیش آماده شده در اکثر کارتهای گرافیکی پیاده سازی شده و دیگری مه گره ای (vertex fog) که با انجام محاسباتی بر روی گره های اشیاء اعمال میشود. یکی دیگر از تکنیکهایی که در ساخت اشیائی همچون درخت، تابلو، لامپ، و… در بازیها کاربرد دارد، قابلیت بیلبرد (billboard) میباشد. این تکنیک که به سادگی قابل پیاده سازی است، برای نمایش اشیاء ثابتی که معمولا روی زمین واقع هستند بکار میرود. مثلا فرض کنید میخواهید یک درخت را در صحنه ای از بازی نمایش دهید. مسلما رندر کردن یک شیء سه بعدی که گره های سازنده آن تنه و شاخه و برگهای یک درخت را نشان دهند خیلی منطقی نمیباشد (چون برای این کار به گره های زیادی نیاز خواهید داشت که این باعث کاهش سرعت برنامه میشود)، در عوض بهتر است تصویری از یک درخت را بعنوان یک بافت بر روی یک مستطیل رندر کنید. سپس میتوانید با نمایش این مستطیل در روی زمین بطوری که مستطیل همواره رو به دوربین باشد، این مستطیل را به عنوان یک درخت زیبا به بیننده معرفی کنید. البته در این روش، از خصوصیات دیگری همچون ترکیب رنگ (blending) و تست آلفا (alpha test) هم استفاده میشود.

مثالهایی از تکنیکهای ویژه، نگاشت محیط اطراف بر روی شیء و بافت برجسته

قبلا اشاره شد که میتوان با استفاده از ماتریسها، تصاویر متحرک را بوجود آورد. این نوع تصاویر متحرک، انیمیشن از نوع ماتریسی نامیده میشوند که علی رغم داشتن تواناییهای بالا، امروزه بدلایلی کمتر از آنها استفاده میشود. در عوض روش نسبتا جدیدتری برای ایجاد انیمیشن مورد استفاده قرار میگیرد که در اصطلاح گرافیک سه بعدی، انیمیشن اسکلتی خوانده میشود. در این روش که بیشتر برای متحرک کردن کاراکترهای بازی بکار گرفته میشود، میتوان کل بدن و دست و پای شخصیت بازی را بصورت یک شیء واحد ساخت. سپس با استفاده از قابلیتهایی همچون پوست انعطاف پذیر (skin)، حرکتهای لازم به اجزاء مختلف بدن فرد داده میشود. بازیهای معروفی مثل Tomb Raider، Quake و Half Life هر یک به گونه ای از این روش برای خلق کاراکترهای خود استفاده کرده اند.
از دیگر ویژگی هایی که میتوان برای واقعی تر کردن یک صحنه سه بعدی از آن استفاده کرد، سایه میباشد. سایه ها که ارتباط مستقیمی با نور دارند، بطور کلی شامل چند دسته میشوند. ساده ترین نوع آنها (همانطور که در مبحث ماتریسها اشاره شد) با نگاشتن گره های یک شیء بر روی یک صفحه تخت بوجود می آید. این نوع محدودیتهای زیادی دارد. بنابراین جز در موارد خاص از آن استفاده نمیشود. نحوه دیگر پیاده سازی سایه، کاربرد بافتهایی میباشد که حاوی تصاویر رندر شده از سایه ها و سایر اثرات نورها در صحنه میباشند. به این تصاویر ویژه light map گفته میشود. این روش سریعترین نوع ایجاد سایه است. ولی تنها میتوان برای اعمال سایه بر روی سطوح تخت از آن استفاده کرد. انعطاف پذیر ترین نوع سایه ها، سایه های حجمی هستند. سایه های حجمی (shadow volume) میتوانند بر روی هر نوع سطحی اعمال شده، و حتی قابلیت ایجاد سایه برای اشیاء متحرک را هم دارا میباشند. البته باید توجه داشت که این، پیچیده ترین و کندترین نوع سایه ها هم میباشد.
از سیستمهای ذره ای (particle system) معمولا برای شبیه سازی پدیده های طبیعی همچون برف، باران، آتش، انفجار و گرد و غبار استفاده میشود. سخت افزارهای جدید، دارای اشیاء آماده ای میباشند که میتوانند بطور مستقیم رندر شده، و حتی تصویری را هم بعنوان بافت بر روی خود داشته باشند. بدین ترتیب میتوان با تنظیم موقعیت، سرعت حرکت، تعداد، طول عمر، رنگ و بافت این ذرات (point sprite) انواع پدیده ها از جمله آتش و برف و باران را به شکلی کاملا واقعی در صحنه های سه بعدی ایجاد کرد.
یکی دیگر از تکنیکهای پیشرفته گرافیک سه بعدی، قابلیت ساخت انواع زمین و محیطهای طبیعی میباشد. میتوان از زمینها (terrain) برای شبیه سازی محیط کوهستان، دشت، تپه و هر نوع ناهمواری طبیعی دیگری استفاده کرد. معمولا روشهای گوناگونی برای رندر کردن این اشیاء وجود دارد.
از جمله تکنیکهای ویژه بسیار پرکاربرد، متحرک سازی بافتها میباشد. همانطور که پیشتر عنوان شد، از ماتریسها میتوان برای متحرک سازی هر چیزی در گرافیک سه بعدی استفاده کرد. حتی میتوان با اعمال یک ماتریس بر روی بافت، تصویر بافت مورد نظر را به اشکال گوناگون در آورد. مثلا تصویری از یک تابلوی تبلیغاتی را در نظر بگیرید که بر روی یک پایه بلند نمایش داده شده است، میتوان با چرخش ماتریس بافت این تابلو، آن را حول پایه بچرخانید تا ظاهر تابلوی تبلیغاتی واقعی تر به نظر برسد.
قبلا به بافرها اشاره کردیم، ولی یک بافر مهم دیگر هم وجود دارد. یعنی بافر استنسیل (stencil buffer) که تکنیکهای بسیار زیادی توسط آن قابل پیاده سازی میباشند. از جمله این تکنیکها سایه حجمی (که پیشتر به آن اشاره شد)، آینه، ماسک کردن تصویر، برش زدن مناطق دلخواهی از تصویر، ایجاد اشیاء شفاف، محو تصاویر در پس زمینه و ترکیب تصاویر با هم میباشد.
در آخر هم باید به سایه زنها اشاره کنیم. سایه زنها (shader) در واقع پرده آخری میباشند که فراروی شما قرار دارند. با عرضه سایه زنها، و زبانهای سایه زنی، انقلابی در عرصه گرافیک کامپیوتری ایجاد شد و بسیاری از محدودیتهای که تا چندی پیش در سر راه برنامه نویسان گرافیکی (بخصوص سازندگان بازی) قرار داشتند عملا کنار رفتند. امروزه سایه زنهای گره، سایه زنهای پیکسل، سایه زنهای بافت و سایه زنهای نوری وارد صحنه شده اند و میتوان توسط زبانهایی مثل Assembly، C، و حتی Delphi برای آنها برنامه نوشت. وقتی شما از سایه زنها استفاده میکنید، به گونه ای خط رندر کارتهای گرافیکی را بطور کامل تحت تسلط خود در آورده اید. در اینجا کلیه عملیات، از گرفتن گره های ورودی، پردازش، تبدیل، برش، و نگاشت آنها تا پیاده سازی فرمولهای مه، نورپردازی، بافت زنی، سیستمهای ذره ای و انعکاسهای نوری بر عهده خودتان میباشد. حتی میتوانید در سطحی پایینتر، بر روی تک تک پیکسلهای صفحه کار کنید و آنها را با فرمولهای ابداعی خودتان تحت تبدیلات مختلف قرار دهید. امروزه رقابت اصلی سازندگان کارت های گرافیکی بر سر سایه زنها میباشد؛ و Render Monkey (محصول شرکت ATI)، CG (محصول nVidia) و HLSL (محصول مایکروسافت) که همگی برای برنامه نویسی پردازنده های گرافیکی ایجاد شده اند محصول این رقابت شدید میباشند.
شاید بد نباشد که در انتها، از چند تن از بزرگان و پایه گذاران گرافیک سه بعدی کامپیوتری نامی ببریم. افرادی چون James Blinn، Andy Catmull، Phillip Taylor و John Carmack در صنعت گرافیک سه بعدی، همچون اسحاق نیوتن، آلبرت اینشتین، هاینریش هرتز و جیمز وات در علم فیزیک هستند. برای مثال Carmack نامی آشنا برای همه علاقمندان به بازی میباشد. او را پدر صنعت بازیهای کامیپوتری نامیده اند، زیرا بازیهایی چون Doom و Quake محصول خلاقیتهای او و همکارانش (همچون Tom Hall) میباشند. Taylor هم تا چندی پیش رئیس تیم سازنده DirectX در شرکت مایکروسافت بود.

موفق باشید.

نویسنده: سید علی الحسینی

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

اجرا شده توسط: همیار وردپرس