تسلیشن به معنی تقسیم مثلثهای مش در گرافیک سهبعدی به مثلثهای بیشتر گفته میشود. در ادامه معمولاً با استفاده از نگاشت جابجایی، تکههایی از سطح با توجه به رنگ و بافت برآمده میشود. با Tessellation و Displacement Mapping میتوان سطوح صاف را به سطوح ناهموار و واقعی تبدیل کرد، بدون آنکه مش بسیار پیچیده و سنگین شود و سرعت اجرای بازی را کاهش دهد.
در ادامه به مفهوم تسلیشن و نگاشت عمودی و Displacement Mapping یا نگاشت جابجایی میپردازیم.
کاربرد عمومی تسلیشن
Tessellation به معنی مفروشسازی است، سطوح پیچیده و منحنیشکل با طرحی از اشکال مسطح پوشیده میشود به گونهای که سطوح کوچک با هم تداخلی نداشته باشند و در عین حال هیچ بخشی از سطح پیچیده خالی نماند.
تِسِلِیشِن میتواند با طرحی منظم انجام شود، مثل موارد زیر:
و گاهی طرح نیمهمنظم به کار میرود:
اما ببینیم در بازیها تسلیشن چه معنایی دارد.
تسلیشن در بازیها
تسلیشن تکنولوژی جدیدی نیست، سالهاست که این تکنولوژی در بازیهایی با گرافیک خلاقانه مثل کرایسیس به کار رفته است و اکنون در بازیهای جدید مثل GTA V برای غیرفعال کردن آن هم آپشنی در نظر گرفته شده است. اولین بار انویدیا مقولهی تسلیشن را با همکاری Epic Games عملی کرد و در حقیقت موتور گرافیکی Unreal Engine 3 اولین موتور گرافیکی مجهز به تسلیشن است.
با معرفی دایرکت ایکس 11 مقولهی تسلیشن و نگاشت جابجایی بسیار مهم و متداول شد چرا که در دایرکت ایکس 11 میتوان پایپلاین (مسیر اجرای پردازشهای مربوط به تسلیشن) را برنامهریزی کرد.
در حالت عادی، یک مکعب سهبعدی از وجوهی که هر یک با دو مثلث (چهار وجهی) ساخته شدهاند، شکل میگیرد. تسلیشن هر مثلث را به دو مثلث کوچکتر تبدیل میکند. به این ترتیب میتوان گوشههای سطوح را از حالت تیز و غیرواقعی خارج کرد و از آن جالبتر اینکه جزئیاتی مثل پستی و بلندیها به آن اضافه کرد.
مکعب یک مثال ساده است، در طراحی یک کاراکتر پیچیده، تسلیشن و نگاشت عمودی بسیار مفید هستند:
نگاشت عمودی یا Normal Mapping برای ناهمواریهای ظریف
برای ایجاد پستی و بلندی میتوان از همان ابتدا سطح را پیچیده طراحی کرد. مثلاً به جای مش پیچیدهای که شامل 500 هزار مثلث است، از 4 میلیون مثلث استفاده کرد. مش سادهتر با چندضلعیهای کم، در محاسبات گرافیکی و سرعت اجرای بازیها بسیار موثر است. روش خوبی نیست و مدل بسیار پیچیده شده است. میتوان از همان 500 هزار مثلث استفاده کرد اما در هنگام نورپردازی و محاسبهی سایه روشنها، از نگاشت عمودی یا Normal Mapping استفاده کرد.
منظور از نگاشت یا Map کردن، طراحی و تبدیل است. مثلاً واحد بافت یا Texture Mapping Unit، بافت که در واقع یک عکس کوچک است را روی سطح سهبعدی اجسام ترسیم میکند.
نگاشت عمودی نوعی طرح رنگی است که اگر روی سطحی صاف اعمال شود، سایه و روشنهایی به آن اضافه میکند و به نظر میرسد که سطح دارای پستی و بلندی است. مثل نمونهی زیر که نگاشت عمودی (وسط) برگرفته از مدل واقعی (چپ) روی سطح صاف اعمال شده و نتیجه تصویر سمت راست است:
به مدل مجسمه برگردید، مش سادهتر مدل را ساده کرده ولیکن با اضافه شدن نگاشت عمودی که خوشبختانه مثل تصاویر دوبعدی ساده است، سطح ظاهراً ناهموار و واقعی میشود. مسأله صرفاً اضافه کردن سایه روشن نیست، به تصویر زیر توجه کنید:
مدل کره با استفاده از Bump Mapping که اساس آن شبیه نگاشت عمودی است، به یک کرهی ناهموار تبدیل شده اما شکل کلی تغییری نکرده است و کره کاملاً گرد است. در واقع لبههای کره دقیقاً یک دایره را توصیف میکنند.
نگاشت جابجایی یا Displacement Mapping بر اساس بافت برای تغییر مش
گام بعدی استفاده از نگاشت جابجایی یا همان Displacement Mapping است، بخشهایی از سطح بالاتر و بخشهایی پایینتر میروند و سطح به کلی ناهموار میشود.
اما چطور؟ طرح نگاشت جابجایی از چه منبعی تهیه میشود؟
استفاده از بافت برای برجسته کردن سطح
طرح برآمدگیها و فرورفتگیها، همان بافت است! به کره توجه کنید، مناطق سبز در تصویر سمت راست برآمده هستند و مناطق قهوهای فرورفته. نگاشت جابجایی لزوما بافت پیچیده نیست، میتوان با بافت بسیار سادهی سمت چپ، گرافیک سهبعدی سمت راست را ایجاد کرد:
سری به بازی کرایسیس بزنیم، دیوار آجر بافت سادهای دارد و بدون تسلیشن و در حقیقت نگاشت جابجایی، کاملاً مسطح است. اما اگر رنگ تیره را به فرورفتگی و رنگ روشن را برآمدگی تفسیر کنیم چطور؟ مقایسه کنید:
البته نگاشت جابجایی مش اجسام را تغییر میدهد و محاسبهی تغییر مش، خود زمانبر است ولیکن پیچیدگی مش چندان متحول نمیشود. به علاوه محدودهی خاصی برای تسلیشن تعیین میشود، اجسام دوردست نیازی به جزئیات زیاد ندارند و لذا تسلیشن برای اجسام دوردست، غیرفعال است.
به عنوان مثال تسلیشن جاده در فاصلهی زیاد، دیده نمیشود:
انویدیا در معماری فرمی، کپلر و در حال حاضر مکسول، برای اجرای بهتر تسلیشن واحدهای اختصاصی در نظر گرفته است تا سرعت اجرای بازیها افت شدیدی نداشته باشد. از طرفی انویدیا فریمورک خاصی برای تسلیشن در نظر گرفته تا توسعهدهندگان زمان کمتری برای پیادهسازی تسلیشن در بازیها صرف میکنند، البته اگر توسعهدهنده بخواهد تسلیشن را بهینه کند و تنظیماتی برای آن در نظر بگیرد، مشکلی وجود ندارد.
کارت گرافیکهای AMD هم برای اجرای بهتر تسلیشن بهینه شدهاند، بنابراین در حال حاضر یکی از روشهای مفید و بهینه برای بهبود گرافیک بازیها، تسلیشن است.
در پردازندههای گرافیکی وسایل همراه (گوشی و تبلت) هم تسلیشن تدریجاً مهم شده است. به عنوان مثال کوآلکام در معرفی توانمندیهای آدرینو 420 که پردازندهی گرافیکی به کار رفته در S810 است، از بهبود گرافیک با پیادهسازی تسلیشن میگوید:
اثر تسلیشن بر سرعت اجرای بازیها و کیفیت گرافیک
با فعال کردن تسلیشن ناهمواریهای کوچک که در حقیقت سایه روشن هستند و ناهمواریهای بزرگ که در اثر نگاشت جابجایی ایجاد شدهاند، به بازیها اضافه میشود. طبعاً سرعت اجرا میتواند افت زیادی داشته باشد.
در بازی جدیدی مثل GTA V اگر از کارت گرافیکهای ایامدی استفاده شود، سرعت اجرای متوسط در حد 10 درصد کمتر خواهد شد که رقم بسیار خوب و مطلوبی است:
اینتوتک
این درسته که در dx12 پردازش تسلیشن 12 برابره پردازش انجام میشه? و سوال دیگه پیش می اد بیشترین مثلث های به کار رفته تو یه بازی چه قدر بودند ? و کدوم بازی
فکر نمیکنم این جوری باشه. 12 برابر تو بحث Draw Call یا فراخوانی ترسیم مطرح هست اما تو بحث تسلیشن خود کارت گرافیک اکثر کار رو انجام میده و این جور نیست که دایرکت ایکس 12 اثر شدیدی بزاره.
http://www.gamespot.com/articles/directx-12-can-render-up-to-12-times-more-polygons/1100-6427026/
نه این بحثش جداست. تایم پردازنده کم بشه سرعت رندر میره بالا اما بحث اینه که کارت گرافیک سرعت رندر کردنش بی نهایت که نیست … اون هم کم میاره و پردازنده معطل میمونه.
تو دموی فاینل فنتسی 15 یا هر چی که اسمش خواهد بود 64 میلیون مثلث یه جا رندر شده و بدون دایرکت ایکس 12 همچین تعداد فراخوانی عجیبی ممکن نبود مگر اینکه پردازنده بسیار بسیار سریع میشد.
در واقع میخوام بگم دایرکت ایکس بیشتر استفاده از پردازنده رو بهینه میکنه تا افزایش سرعت رندر تو کارت گرافیک.
ای کاش اشاره ای به تسلیشن داخلی هم میکردید این نشون میده دنیای بازی چه قدر تشنه چند ضلعی های بیشتره و موها فکنم هر مو یک متلت بگیره موهای بلند هم همون قدر مثلث میگیره ؟
در مورد تسلیشن داخلی من چیزی نخوندم … نمیدونم منظور چی هست اصلا.
رشتهی بلند مو و پارچه یا هر چیزی به نظرم با رشتهی کوتاه فرق داره. با یک مثلث و تسلیشن ممکنه بشه جزئیات رو زیاد کرد اما حرکات واقعی رو فکر نمیکنم بشه شبیهسازی کرد.
در واقع Pure Hair و TressFX رو بعداً باید بررسی کنم و در موردشون بنویسم چون برای خودم هم واقعاً سواله که اساس کار چی هست و چرا این قدر سنگین اجرا میشن.
تسلیشن داخلی روی سطح اجسام نیست بلکه داخلشونه وقتی تغیر شکل میده از اون تسلیشن یا چند ضلعی داخلی استفاده میکنند نمونش دموی NVIDIA Alien vs. Triangles در مورد مو مبحث مورد علاقه منم هست مطلبشو نوشتی کامنت دارم اونجا