مِش شیدر (Mesh Shader) چیست و چرا تنها Alan Wake 2 از آن بهره مند است؟

مِش شیدر (Mesh Shader) چیست و چرا تنها Alan Wake 2 از آن بهره مند است؟

زمانی که برای اولین بار اعلام شد که بازی Alan Wake 2 برای اجرا، نیازمند کارت های گرافیک با پشتیبانی از Mesh Shader است، گیمر هایی که هنوز از کارت گرافیک های قدیمی تر مانند سری GTX-10 یا RX-5000 استفاده می کردند بسیار نا امید شدند. پس از عرضه بازی مشخص شد که این بازی روی کارت گرافیک های قدیمی تر نیز اجرا می شود، اما بدون Mesh Shader، عملکرد آن ها در گیم بسیار بد و حتی غیر قابل بازی بود! به این ترتیب به سوال اصلی می رسیم، Mesh Shader اصلا چیست و چرا اینقدر در فرم ریت بازی های جدید تاثیر گذار است؟ مِش شیدرها به سازندگان گیم اجازه می دهند اشکال چند وجهی موجود در بازی را با قدرت و کنترل بسیار بالاتری نسبت به شیدر های قدیمی تر مانند Vertex پردازش کنند؛ به قدری که در آینده نزدیک، گیم ها به عنوان مثال می توانند به طور هم زمان میلیارد ها مثلث را برای نمایش بفرستند و کارت گرافیک شما بدون هیچ تلاش زیادی از پس آن ها بر آید! اگر از خود می پرسید، با توجه به وضع فعلی و غیر بهینه گیم های امروزی چنین چیزی چطور ممکن است، به خواندن ادامه دهید!

همانطور که احتمالا می دانید، دنیای سه بعدی بازی ها با تعداد بسیار زیادی مثلث به وجود می آید. اولین مرحله از رندرینگ مدل های سه بعدی (قبل از پروسه طولانی اعمال کردن Texture ها و رنگ آمیزی پیکسل ها) در حرکت دادن و تغییرات اندازه این مثلث ها خلاصه می شود. در API گرافیکی Direct3D، تعداد زیادی کد برای انجام تمام این مراحل استفاده می شود که Vertex Shader نامیده می شود. (Vertex به معنای گوشه مثلث است). چند مدل شیدر دیگر نیز مانند Hull Shaders، Domain Shaders و Geometry Shaders وجود دارند که سازندگان بازی به کمک آن می توانند به مدل های سه بعدی و محیط های ساخته شده توسط طراحان، در مانیتور های ما زندگی ببخشند. در بازی های امروزی، Vertex Shader ها جزو شیدر های سنگین و نیازمند به سخت افزار قدرتمند به شمار نمی روند. این به این دلیل است که اکثر گیم ها برای ساختن جهانشان از تعداد زیادی مثلث استفاده نمی کنند و برای اکثر قسمت های بازی به جای ایجاد حجم عظیمی از محاسبات و شیدر های پیکسلی، سعی میکنند از تعداد کمی از مثلث ها استفاده کنند. البته صحنه های Close-up از صورت و بدن کاراکتر ها متفاوت اند و استفاده از Vertex Shader ها در این صحنه ها تا حدودی بالا می رود.

عکس پایین، تمام پردازش های گرافیکی مورد نیاز برای تولید یک فرم از بازی Cyberpunk 2077 را نشان می دهد. تمام تنظیمات گرافیکی روی بالا ترین حد خود بوده و حتی Path Tracing و Upscaling در حال اجرا هستند. اگر به قسمت Vertex/Tess/Geometry Warps دقت کنید، مشخص است که پردازش های Vertex نسبت به بقیه پردازش ها، بسیار کم و کوچک هستند.

با دیدن این تصویر شاید با خود تصور کنید که این بازی میتوانست با تعداد بسیار بیشتری از مثلث ها نیز بسیار خوب اجرا شود. با این حال، مورد مهم تنها تعداد مثلث ها نیست بلکه همچنین مهم است که چقدر آسان می توان آن تعداد از مثلث ها را مدیریت کرد. این دقیقا جایی است که مشکلات Vertex Shader نمایان می شود. کاری که سازنده بازی میتواند با Vertex Shader ها انجام دهد بسیار محدود است و همچنین قبل از پردازش بقیه اجزای بازی، نیاز است تک تک مثلث ها پردازش شوند. اگر به این موضوع دقت کنید که اکثر این اشیاء حتی اصلا قرار نیست توسط کاربر دیده شوند، به محدود کننده بودن این ویژگی بیشتر پی خواهید برد! اگر بخواهید از شر محدودیت های Vertex خلاص شوبد، یا باید هر دستوری که به کارت گرافیک می دهید را بعد از رندر شدن Vertex ها انجام دهید یا هر دفعه پس از رندر شدن Vertex ها، تمام آن ها را دور بریزید. این روش ها اصلا بهینه نیستند و اگر بخواهید کارهای پیچیده تری را با شیدر قدیمی Direct3D Vertex انجام دهید، عملا غیر ممکن خواهد بود. به همین دلیل، گیم های امروزی از Vertex های زیادی استفاده نمی کنند.

برای حل این مشکلات، مایکروسافت Mesh Shader را با حالت آزمایشی (Beta) در سال 2019 میلادی معرفی کرد و سپس این شیدر در سال 2020 به طور عمومی به Direct3D اضافه شدند (که به طور عمومی به DirectX 12 Ultimate معروف شد). از طرفی انویدیا نیز در سال 2018 با انتشار یک دمو، بر قابلیت های فوق العاده Mesh Shader با معرفی کارت گرافیک های Turing (RTX-20) خود تاکید کرده بود. با این شرایط حتما تصور می کنید بسیاری از سازندگان بازی از همان زمان به استفاده از Mesh Shader روی آورده اند، اما متاسفانه اینطور نیست و تا سال 2021 که شرکت UL Solutions تست Mesh Shader را روی نرم افزار بنچمارک گرافیکی 3D Mark آغاز کرد، و یک کنفرانس توسعه دهندگان انویدیا در سال 2022، هیچ توسعه دهنده بازی از این ویژگی استفاده نکرده بود. در واقع هیچ بازی با استفاده از Mesh Shader تا قبل از عرضه Alan Wake 2 معرفی و عرضه نشد! اما Mesh Shader در واقع چیست؟!

بهترین راه درک کردن Mesh Shader این است که آن را به یک پایگاه بزرگ محاسبه کننده مثلث ها تشبیه کنیم. این شیدر جدید، انعطاف بسیار زیادی برای پردازش تعداد زیادی از گروه مثلث ها (که بهشان Mesh می گوییم) ارائه می دهد. به طور مثال، Mesh Shader می تواند یک Mesh بزرگ را به تعداد زیادی گروه مثلث های کوچک تر (که مایکروسافت آن ها را Meshlet می نامد) تقسیم کرده و محاسبات آن ها را به چندین رشته (Thread) مختلف توزیع کند. کارت گرافیک های مدرن سال ها است که در پردازش های بزرگ موازی به شدت خوب هستند و با استفاده از Amplification Shader و Mesh Shader حالا سازندگان بازی کنترل بسیار بیشتری روی پردازش مثلث ها دارند، به خصوص اگر بحث روی چگونگی و زمان فراخوانی آن ها باشد. تمام این ها به این معنی است که حالا بازی ها می توانند از مدل های پر جزئیات تری با استفاده از چند وجهی ها استفاده کنند.

حالا اگر Mesh Shader تا این حد خوب است، چرا اینقدر طول کشید تا سازندگان بازی از آن در بازی ها استفاده کنند؟ به خصوص که تست های 3D Mark نشان از پتانسیل زیادی در افزایش عملکرد داخل بازی ها داشتند؟ خب، چند دلیل باعث تاخیر سازندگان بازی در استفاده از Mesh Shader شد. اولین دلیل این بود که سخت افزار ها نیاز به پشتیبانی از Mesh Shader داشتند. در کارت گرافیک های انویدیا تنها مدل های RTX-20 به بالا و در کارت گرافیک های AMD، مدل های RDNA-2 به بالا از این ویژگی پشتیبانی میکنند. شاید تصور کنید با معرفی RTX-20 در سال 2018، حالا دیگر نباید مشکلی از این نظر در سال 2023 وجود داشته باشد اما بسیاری از گیمر ها همچنان از کارت گرافیک های قدیمی تر استفاده می کنند، هر چند روز به روز بر تعداد کاربرانی که سیستم های گیمینگ جدیدی خریداری میکنند یا کارت گرافیک خود را ارتقا می دهند افزوده می شود.

سوال دیگری که پیش می آید این است که زمانی که کارت گرافیک های مجهز Ray Tracing (رهگیری پرتو) معرفی شدند، اکثر سازندگان به سرعت این ویژگی را به بازی خود اضافه کردند. پس چرا همین کار را با Mesh Shader انجام ندادند؟ خب، نمی شود تاثیر کنسول ها بر روی تمام این اتفاقات را نادیده بگیریم. اولین کنسول مجهز به Mesh Shader، ایکس باکس های سری X/S محسوب می شوند. هرچند چیپ موجود در کنسول PS5 نیز میتواند پردازش های Mesh Shader را انجام دهد اما به دلیل این که سونی از API گرافیکی مخصوص خود استفاده می کند، توسعه دهندگان نمی توانند از یک روش پردازش مثلث ها در تمام پلتفرم ها استفاده کنند. Unreal Engine 5 از ویژگی Mesh Shader برخوردار است (جزوی از ویژگی Nanite) اما به این ویژگی به چشم یک راه جایگزین نگاه نمی کند و آن را تنها یک ویژگی اضافه در پلتفرم خود می بیند. در حال حاضر، تعداد گیم هایی که به طور عمده از Nanite استفاده می کنند به تعداد انگشت های یک دست هم نمی رسد! توسعه دهندگان به تازگی و بعد از سه سال از معرفی DirectX 12 Ultimate (!) در حال اضافه کردن این ویژگی به موتور های بازی سازی خود هستند که به خودی خود گویای مسیر طولانی شناخت یک تکنولوژی جدید تر و استفاده از آن در بازی ها می باشد.

به هر حال در شرایطی که چند سال طول کشید تا Mesh Shader به درستی به بازی ها راه یابد، شکی در این نیست که سازندگان دیگر بازی ها از Remedy و Alan Wake 2 الگو خواهند گرفت و در بازی های بعدی خود به طور کامل از پتانسیل Mesh Shader استفاده خواهند کرد. سال 2023 احتمالا اولین سالی محسوب می شود که بالاخره پتانسیل Ray Tracing به طور کامل در گیم ها مشخص شد، اما سال 2024 می تواند سال Mesh Shader باشد.

نظر خود را بنویسید

نظرات 1

avatar
ممنون از مطالب مفید و عالیتون
۱۴۰۲/۸/۲۴