رندرینگ گاوسی اسپلینگ با شتاب‌دهی GPU در زمان واقعی با نمونه NVIDIA DesignWorks با نام vk_gaussian_splatting

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

vk_gaussian_splatting یک نمونه جدید مبتنی بر Vulkan است که گاوسی اسپلینگ بی‌درنگ را نشان می‌دهد، یک تکنیک رندرینگ حجمی پیشرفته که نمایش‌های بسیار کارآمدی از میدان‌های تابشی را امکان‌پذیر می‌کند. این آخرین مورد اضافه شده به NVIDIA DesignWorks Samples است.

تیم NVIDIA DevTech این پروژه نمونه جدید را به عنوان بستری برای اکتشاف و مقایسه رویکردهای مختلف برای تجسم بی‌درنگ گاوسی اسپلینگ سه‌بعدی (3DGS) در نظر دارد. با ارزیابی تکنیک‌ها و بهینه‌سازی‌های مختلف، هدف این تیم ارائه بینش‌های ارزشمندی در مورد عملکرد، کیفیت و مصالحه‌های پیاده‌سازی هنگام استفاده از Vulkan API است.

پیاده‌سازی اولیه مبتنی بر رستر کردن است و دو رویکرد برای رندر کردن اسپلَت‌ها (splats) نشان می‌دهد، یکی با استفاده از mesh shaders و دیگری با استفاده از vertex shaders.

نموداری که مقایسه مرتب‌سازی همزمان GPU و مرتب‌سازی ناهمزمان CPU در رستر کردن گاوسی اسپلینگ را نشان می‌دهد. سمت چپ جدول زمانی GPU برای مرتب‌سازی همزمان را نشان می‌دهد، در حالی که مراحل 'Dist & Cull' و 'Radix Sort' قبل از پردازش 'Mesh' و 'Fragment' برای هر فریم انجام می‌شوند. سمت راست مرتب‌سازی ناهمزمان CPU را نشان می‌دهد، در حالی که یک رشته مرتب‌سازی جداگانه 'Dist & Sort' را بدون حذف محاسبه می‌کند، شاخص‌ها را تعویض می‌کند و سپس قبل از پردازش مراحل 'Mesh' و 'Fragment' توسط GPU، آنها را در VRAM کپی می‌کند.
شکل 1. مقایسه روش‌های مرتب‌سازی، که برای خط لوله mesh shader نشان داده شده است.

از آنجا که گاوسی اسپلَت‌ها برای ترکیب آلفای صحیح نیاز به مرتب‌سازی از عقب به جلو دارند، دو روش مرتب‌سازی جایگزین ارائه شده است:

  • Radix Sort مبتنی بر GPU که در یک خط لوله محاسباتی پیاده‌سازی شده است.
  • یک استراتژی مرتب‌سازی ناهمزمان مبتنی بر CPU که از تابع مرتب‌سازی چند رشته‌ای از C++ STL استفاده می‌کند.
تصویری از برنامه نمونه vk_gaussian_splatting که یک مدل رندر شده سه‌بعدی گاوسی اسپلینگ از یک دوچرخه در نزدیکی یک نیمکت پارک با درختان و مسیری در پس‌زمینه نمایش می‌دهد. رابط کاربری شامل پنل‌های مختلف تنظیمات و آمار است. در سمت راست، گزینه‌هایی برای ذخیره‌سازی داده، رندرینگ و روش‌های مرتب‌سازی قابل مشاهده است، با تنظیماتی برای V-Sync، حذف فرستوم، مقیاس اسپلَت و mesh shaders. در پایین، آمار حافظه و یک پنل پروفایلر استفاده از GPU و CPU را نشان می‌دهد، از جمله زمان فریم، مرتب‌سازی و عملکرد رندرینگ. برنامه با سرعت 510 FPS با زمان فریم 1.961 میلی‌ثانیه اجرا می‌شود.
شکل 2. رابط کاربری vk_gaussian_splatting چندین عنصر بازخورد پروفایلینگ را ارائه می‌دهد، مانند استفاده از حافظه در RAM و VRAM، همراه با تایمرهای عملکرد که مراحل مختلف خط لوله را اندازه‌گیری می‌کنند.

این نمونه به شما امکان می‌دهد تا جنبه‌های مختلف این تکنیک رندرینگ را اکتشاف و تجربه کنید، از جمله:

  • چندین حالت تجسم برای بررسی جنبه‌های مختلف گاوسی اسپلَت‌ها (هارمونیک‌های کروی، اسپلَت‌ها، چگالی نقطه و موارد دیگر)
  • یک سیستم بنچمارک کامل در دسترس است و امکان پروفایلینگ در زمان واقعی را فراهم می‌کند.
  • جزئیات بیشتر در مورد مصرف حافظه RAM و VRAM، برای درک جریان داده برای رندر کردن
  • زمان‌بندی‌های GPU برای هر مرحله از تکنیک‌های مختلف بررسی شده، برای درک حجم کار و تنگناهای احتمالی
  • گزارش‌های گرافیکی که با تمام این اعداد تولید می‌شوند.
نمودار میله‌ای با عنوان 'مقایسه عملکرد خط لوله - فرمت‌های ذخیره‌سازی SH در float 32، float 16 و uint 8' که معیارهای عملکرد را از یک نمونه Vulkan Gaussian Splatting نشان می‌دهد. این نمودار زمان‌های پردازش را در میکروثانیه در صحنه‌های آزمایشی مختلف مقایسه می‌کند، با میله‌های انباشته شده که نشان‌دهنده سه مرحله خط لوله هستند: توزیع GPU (سیاه)، مرتب‌سازی GPU (سبز تیره) و رندرینگ (سبز روشن). صحنه‌های مختلف در امتداد محور x فهرست شده‌اند، از جمله دوچرخه، کاپوت، پیشخوان، اتاق غذاخوری، گل‌ها، باغ، آشپزخانه، اتاق بازی، اتاق، تنه درخت، قطار، تپه‌درخت و کامیون - هر کدام با تعداد اسپلَت و جزئیات فرمت در پرانتز. بیشتر صحنه‌ها زمان‌های پردازش کلی بین 500-1500 میکروثانیه را نشان می‌دهند، در حالی که رندرینگ معمولاً پرهزینه‌ترین مرحله است. صحنه باغ بالاترین زمان پردازش کلی را با نزدیک به 3000 میکروثانیه نشان می‌دهد. این نمودار نشان می‌دهد که فرمت‌های ذخیره‌سازی هارمونیک کروی کوچکتر (uint8 در مقابل float16 در مقابل float32) به طور مداوم منجر به عملکرد رندرینگ سریع‌تر در تمام صحنه‌های آزمایشی می‌شوند.
شکل 3. نمونه‌ای از گزارش مقایسه عملکرد رندرینگ با فرمت‌های مختلف ذخیره‌سازی داده برای یک مجموعه داده کامل

این نمونه یک نقطه شروع برای توسعه‌دهندگانی است که به دنبال آزمایش تکنیک‌های رندرینگ گاوسی اسپلینگ و بهینه‌سازی‌های مبتنی بر Vulkan هستند.

برای شروع اکتشاف رندرینگ بی‌درنگ میدان‌های تابشی عصبی، به مخزن GitHub nvpro-samples/vk_gaussian_splatting مراجعه کنید.