آموزش بازی سازی: ترفندهایی برای پیاده سازی گرافیک واقع گرایانه
در مقالهی قبلی آموزش بازی سازی بیان کردیم که به عنوان اولین پروژههای خودتان سراغ گرافیکهای واقعگرایانه نروید چرا که به وضوح انجام چنین پروژههایی از حیطهی تواناییهای یک فرد تازهکار خارج است. اما به هر جهت اگر شما تصمیم خود را گرفتهاید و میخواهید در این زمینه فعالیت داشته باشید، به شما توصیه میکنیم نکات این مقاله را از دست ندهید.
چرا صرفهجویی در منابع مهم است؟
همان گونه که در مقالهی قبلی به صورت مختصر هم به این موضوع اشاره کردیم، بزرگترین مانع برای پیادهسازی یک گرافیک واقعگرایانه محدودیتهای سختافزاری است. اما نکتهای که در این بین وجود دارد این است که در گذر زمان و با پیشرفت فرآیند بازیسازی، چه تدابیری برای این مسئله اندیشه شده است؟
نکتهی مهمی که باید به آن توجه داشته باشید این است که مهم نیست چقدر سختافزارهای داخل بازار پیشرفت کرده و قدرتمند بشوند، شما باید همیشه به دنبال جدیدترین روشهای بهینهسازی و یادگیری ترفندهای موجود در این زمینه باشید. دلیل این موضوع هم چیزی نیست جز این که منابع بیشتر سختافزاری در دسترس به معنی این است که شما فضای بیشتری برای نشان دادن قدرت خلاقیت و نبوغ خود دارید. مثلا اگر دقت کرده باشید کنسولهای موجود درون بازار از یک سختافزار مشخص و غیرقابل تغییر بهره میبرند و این شرایط برای همهی تیمهای بازیسازی یکسان است. اما در این بین تعداد محدودی از استودیوهای بازیسازی مشاهده میشوند که بازیهای واقعگرایانهی آنها از گرافیک بالاتری به نسبت دیگر استودیوها برخوردار است و تازه پس از انتشار هر نسخه از بازیهایشان هم نشان میدهند که هنوز فضایی برای ارتقا کیفیت گرافیکی بازی با همین سختافزار محدود هم وجود دارد.
توجه کنید که پرداختن به یک سری موارد فنی همچون بهینهسازی موتور بازیسازی و ارتقای آن در مباحث امروز ما جایی ندارد و دلیل این موضوع هم تخصصی بودن بیش از حد این مسئله و حتی خارج بودن آن از توان ما است. برای همین سعی میکنیم متناسب با حال و هوای یک توسعه دهندهی تازهکار، نکاتی را برای شما بیان کنیم.
مدلسازی
معمولا اولین نقطه برخورد همهی ما با مبحث بهینهسازی در مدلسازی رخ میدهد. همهی ما میدانیم که در یک بازی سهبعدی تقریبا همه چیز در ابتدا مدلسازی شده و سپس درون موتور بازیسازی قرار میگیرد. برای همین اگر بتوانیم در این مدلها حتی به مقدار کمی بهینهسازی صورت دهیم، در انتها میتوانیم عملکرد فنی به مراتب بهتری را شاهد باشیم.
یکی از مهمترین موارد در مدلسازی، حذف قسمتهایی است که مخاطب به هیچ وجه آنها را مشاهده نمیکند
به عنوان نمونه به عکس بالا نگاه کنید. اگر چه این مدل با جزییات فراوان ساخته شده و واقعا زیبا است، ولی به هیچ وجه قابل استفاده در محیط بازی نیست و دلیل آن هم بهینه نبودن آن برای بازیسازی است. بدانید که مدلسازی برای یک بازی کاملا متفاوت با مثلا مدلسازی برای یک پروژهی انیمیشنسازی است. دلیل این موضوع هم این است که شما در یک بازی معمولا باید حداقل ۳۰ فریم در ثانیه رندر لحظهای را برای مخاطب به همراه داشته باشید و این در حالی است که شما میتوانید هر فریم از انیمیشن خود را در یک روز رندر کنید و در انتها همهی آنها را در قالب یک فیلم به مخاطب خود نشان دهید.
اولین نکتهای که شما باید در مورد مدلسازی بدانید، کسب آگاهی و شناخت در رابطه با موارد پرهزینه (از لحاظ سختافزاری) است. مثلا در همین عکس بالا بدون شک بخشهای پرهزینهی مدل ما اول از همه موهای سر کاراکتر و در قدم بعدی قسمت پایین شلوار آن است. معمولا در دنیای مدلسازی جدا از این که مدل مورد نظر در چه جایی مورد استفاده قرار میگیرد، سعی میکنند مواردی همچون موها، ریشها و تقریبا هر چیزی را که از واحدهای بسیاری تشکیل شده است با استفاده از سیستم ذرات پیادهسازی کنند.
اما به هر جهت معمولا برای این که بتوانیم نمای خوبی از محصول مورد نظر داشته باشیم، باید از چند هزار ذره برای مثلا شبیهسازی موی سر استفاده کنیم که همین مسئله باعث میشود منابع سختافزاری فراوانی مورد استفاده قرار بگیرد. با این حال ترسیم دستی ریشهای یک مدل هم کار عاقلانهای نیست و وقت زیادی را از طراحان طلب میکند.
روشی که در این نقطه معمولا برای شبیهسازی ریش و حتی موی سر مورد استفاده قرار میگیرد به این صورت است که سعی میکنند در ابتدا و با استفاده از اشکالی بسیار بزرگتر از یک تار مو و با استفاده از همان سیستم ذرات و تواناییها آن فرم کلی ریش و مو سر کاراکتر را شبیهسازی کنند. مثلا چیزی مانند شکل زیر:
سپس سعی میکنند با استفاده از بافتهایی که برای ریش و موی سر آماده کردهاند و قرار دادن آنها روی همین اشکال کوچک و مربعی شکل که منجر به تکرار فراوان آن بافت در جهتهای دلخواه ما میشود، موی سر انسان یا حتی ریش آن را شبیهسازی کنند. در این حالت شاید منابع مصرفی حداقل به یک صدم یا شاید یک هزارم حالت قبلی هم برسد. دقت کنید در مواقعی که به چیزی مانند ته ریش نیاز دارید بهتر است صرفا به یک بافت آماده و قرار دادن آن روی بخشهای مورد نظر صورت اکتفا کنید و اصلا نیازی به پیادهسازی روش قبلی نیست.
نکتهی بعدی موجود در مدلسازی حذف قسمتهایی است که مخاطب به هیچ وجه آنها را مشاهده نمیکند. شاید این مورد خیلی پیشپا افتاده باشد ولی توجه به آن میتوند حجم منابع مصرفی مدل شما را به شدت کاهش دهد. مثلا بعضا مشاهده میشود که در ابتدا فرم کلی و کامل بدن یک انسان مدلسازی شده و سپس روی آن لباسهای او مدلسازی میشود. در چنین حالتهایی بهتر است تمامی قسمتهایی را که در زیر پیراهنها و شلوارها قرار میگیرد حذف کنید. شاید در انتها از یک بدن کامل انسان تنها یک سر و گردن و دستها از مچ به بعد موجود باشد ولی به خاطر ماهیت مدلسازی هیچ تاثیری بر کیفیت کار نهایی شما و ظاهر آن نخواهد داشت. چنین چیزی در مورد تمامی مدلها صدق میکند و بدانید که در مبحث مدلسازی آنچه که در دید مخاطب قرار ندارد هیچ ارزشی هم ندارد.
نکتهی بعدی طراح و مدلسازی اجزای بازی به صورت چند تکه است. مثلا فرض کنید میخواهید ساختمانی را مدلسازی کنید که مراحل بازی درون آن جریان دارند. یکی از حالتهای ممکن طراحی یکپارچه آن یا حداقل طراحی جداگانه طبقات آن و سپس وارد کردن آنها در موتور بازیسازی است. اما به یکباره پس از این که مثلا در طبقهی دوم و در یکی از اتاقها بازی را شروع میکنید احساس میکنید بازی شما بیدلیل دچار افت فنی شده است و این در حالی است که شما تنها در یک اتاق بسیار ساده هستید. دلیل این موضوع ریشه در نحوهی عملکرد موتورهای بازیسازی و پردازش عناصر محیط دارد.
در تمامی موتورهای بازیسازی بزرگ امروزی قابلیتی وجود دارد که به وسیلهی آن موتور بازیسازی صرفا عناصری را رندر میکند که در روبهروی دوربین قرار داشته باشند. مثلا به شکل زیر دقت کنید.
این تصویر مربوط به موتور یونیتی است و یک نمای بالا به پایین از کاراکتر اصلی و مرحلهای را که در آن قرار گرفته است نشان می دهد. بدون شک بقیه نقاطی که در دید ما قرار ندارند بیکاربرد هستند و نباید بیجهت بار اضافی روی سختافزار سیستم اعمال کنیم. برای همین مثلا موتور یونیتی با استفاده از قابلیتهایی از قبیل Frustum Culling و به خصوص Occlusion Culling در این صحنه سعی میکند بار اضافی تحمیل شده بر سیستم را کاهش دهد و عناصری را که رندر میکند به شکلهای زیر محدود کند.
در تمامی موتورهای بازیسازی بزرگ امروزی قابلیتی وجود دارد که به وسیلهی آن موتور بازیسازی صرفا عناصری را رندر میکند که در روبهروی دوربین قرار داشته باشند
دقت کنید میزان باری که در حالت آخر (استفاده از قابلیت Occlusion Culling) بر سیستم تحمیل میشود بسیار کمتر از حالت اول است ولی یک نکتهی مهم در این زمینه وجود دارد و آن تاثیر ابعاد عناصر موجود در محیط در این حالتها است. اگر به عکسهای بالا هم دقت کرده باشید دیدهاید که بعضی از قسمتها اگرچه بخش زیادی از آنها در داخل دید دوربین قرار ندارند ولی به خاطر بخش کوچکی از آنها که در داخل تصویر است باز هم پردازش شدهاند. این موضوع به خاطر این است که وقتی یک عنصر در دید دوربین قرار میگیرد به طور کلی مورد پردازش قرار میگیرد و این در حالی است که بخشهای زیادی از آن همچنان ناپیدا هستند. ناگفته مشخص است که هر چقدر تعداد این موارد بیشتر باشد راندمان بازی کمتر خواهد شد و برای همین در چنین مواردی میتوانیم یک شی را به چندین بخش کوچکتر تقسیم کنیم تا کمتر دچار چنین مشکلی بشویم. البته به دلایلی که خارج از حال این مقاله است صرف تقسیم کردن یک شی به قسمتهای کوچکتر ممکن است تاثیر منفی هم روی فرآیند Draw Call اشیا در موتور مورد نظر داشته باشد و این گونه نیست که در تمامی شرایط اقدام مفیدی برای کاهش بار فنی بازی باشد. شما میتوانید مطالب بیشتر در این زمینه را در اسناد موتور مورد نظرتان مطالعه کنید. البته با توجه به این نکته که معمولا اسم بعضی از این فرآیندها در هر موتور ممکن است متفاوت باشد و تضمینی برای یکسان بودن کلیدواژهها وجود ندارد.
صحبت پیرامون نکات این چنینی فراوان است و ما صرفا به چند مورد در این زمینه اشاره کردیم. برای مطالعه بیشتر در زمینهی طراحی مدلهای بهینه میتوانید از این لینک و این لینک که به ترتیب مربوط به موتور یونیتی و آنریل میشوند اقدام کنید.
شبیهسازی
مباحث مربوط به شبیهساز فراوان است. از شبیهسازی آب و آتش گرفته تا شبیهسازی حرکات یک شنل همگی جزوی از این مباحث هستند. اما یکی ترفندهایی که معمولا برای کمکردن بار پردازشی بازی مورد استفاده قرار میگیرد استفاده از انیمیشنها به جای پردازش لحظهای رویدادهاست. مثلا در نرمافزاری مانند 3DSMax کاراکتر مورد نظر را مدلسازی کرده و انیمیشنهای او را هم آماده میکنند. سپس مدل را به همراه انیمیشنهایش وارد نرمافزار Marvelous Designer میکنند. پس از اینکه لباسهای کاراکتر را طراحی کردیم به راحتی میتوانیم در همان نرمافزار Marvelous انیمیشنهای کاراکتر مورد نظر را که در زمان حاضر لباس نیز بر تن دارد اجرا کنیم. خود نرمافزار به طور خودکار حالات لباس را متناسب با حرکات بدن کاراکتر شبیهسازی میکند و در انتها انیمیشنی جداگانه برای لباس آن فرد را به شما تحویل میدهد.
مثل در هنگام دویدن، راهرفتن، پرش و موارد دیگر میتوانیم شبیهسازیهای حرکت شنل را به دست آوریم و در غالب یک انیمیشن درون بازی اجرا کنیم. تنها نکتهی منفی این مسئله همین حرکت محدود شنل به حرکتهای پیشفرض کاراکتر است و دیگر مانند یک پارچهی واقعی بر اساس فیزیک حرکتی عکسالعمل نشان نمیدهد.
در انتها باید به این نکته دقت کنید که استفاده از هر یکی از موارد گفته شده به خصوص مواردی که مقداری کیفیت نهایی را کاهش میدهد بستگی به تصمیم شما و عملکرد فنی بازی در آن بازهی زمانی دارد. حتی گاهی میتوانید بین دو حالت گفته شده سوییچ کنید و بسته به نیاز بازی از هر دوی آنها استفاده کنید. اما در پس تمامی نکاتی که گفته شده باید باز هم تاکید کنیم که گرافیک واقعگرایانه بسیار پیچیدهتر از چند نکتهی گفته شدهی ما در این مقاله است. پیچیدگیهایی که تا درگیر آن نشوید نمیتوانید درک درستی از آنها داشته باشید. بنابراین باز هم پیشنهاد میدهیم که مخصوصا برای شروع کار سبکهای دیگر را انتخاب کنید.
نظرات