470 likes | 751 Views
به نام یزدان پاک. گرافیک در بازی ایمان پولادین Pipeline. مقدمه و معرفی. موضوع و سبک بازی فن آوری های مورد استفاده اهداف پروژه وبلاگ توسعه بازی: http://www.tochalco.com/blog. تاریخچه موتور. تکرار اول: ارتفاء موتور موجود تکرار دوم: تبدیل به DirectX10/11 تکرار سوم: Deferred Rendering
E N D
گرافیک در بازی ایمان پولادینPipeline
مقدمه و معرفی • موضوع و سبک بازی • فن آوری های مورد استفاده • اهداف پروژه • وبلاگ توسعه بازی: http://www.tochalco.com/blog
تاریخچه موتور • تکرار اول: ارتفاء موتور موجود • تکرار دوم: تبدیل به DirectX10/11 • تکرار سوم: Deferred Rendering • دمو
تصمیمات استراتژیک • نوشتن موتور از پایه • Deferred Rendering • DirectX 10/11 API
نوشتن موتور؟ • مزایا • طبق تحقیقات انجام شده اکثر (حدودا 75%) بازیهای AAA دنیا با موتور داخلی تولید شده اند (اطلاعات و مستندات این تحقیق در وبلاگ پروژه موجود است) • عدم وابستگی، توسعه آسانتر، انعطاف پذیری • معایب • زمان و هزینه بالا • ریسک بسیار بالا • عدم وجود تخصص و تجربه کافی ”نوشتن موتور، اختراع دوباره چرخ نیست“
Deferred Rendering? • مزایا • قابلیت رندر تعداد زیادی نور دینامیک • کاهش ترکیب شیدرها مخصوصاً در نور پردازی • وجود اطلاعات لازم برای پیاده سازی افکت های Post Process (Depth of Field, SSAO، Motion Blur، Soft Particles) به علت وجود Gbuffer • دارا بودن سرعتی خطی به نسبت تعداد نورها • O = Number of Objects • L = Number of Lights • Forward: (O*L) Draws, example: 1000 objects + 20 lights = 20000 draw calls • Deferred: (O + L) Draws, example: 1000 objects + 20 lights = 1020 draw calls • صرفه جویی در زمان pixel processing با اعمال شیدرها فقط روی پیکسلهایی که دیده میشوند • اکثر موتورهای مطرح از نور پردازی deferred استفاده می کنند : • CryEngine2, Rockstar RAGE (GTA4, Red dead redemption), X-Ray engine (Stalker), Metro2033, Dead Space engine, KillZone2, 3, … and the list is growing.
Deferred Rendering? • معایب • نیاز به Fill-rate بالا به علت وجود چندین GBuffer بزرگ، به خصوص روی کارت های ضعیف • عدم توانایی در رندر اشیاء شفاف (Transparency) • مشکلات در Anti Aliasing • عدم انعطاف پذیری در تنوع متریال • با در نظر گرفتن مزایا و معایب ذکر شده، در بلند مدت با پیشرفت سخت افزارهای گرافیکی و انطباق و سازگاری بهتر API ها (مانند DirectX 10+) آینده این روش روشن تر است و معایب آن قابل حل خواهند بود.
DirectX 10+? • مزایا • Multi-Threaded Rendering • قابلیت fallback روی سخت افزارهای قدیمی تر (Feature Level) • New texture compression formats • Hardware Tessellation • New helpful shader instructions (SampleCmpLevel, Load, Gather, Bitwise, …) • New Render target formats, UINT (Raw) • Geometry Shaders (Cubemap rendering) • Compute Shaders (PostProcessing, GPU computing) • Cleaner and Faster API • Texture Arrays
DirectX 10+? • معایب • عدم پشتیبانی در سیستم عامل های پایین تر از VistaWindows • عدم پشتیبانی در سخت افزارهای قدیمی تر • مشکل تر (حرفه ای تر) شدن برنامه نویسی (این مورد می تواند مزیت نیز باشد)
DirectX 10+? • آینده • آمار از سایت Steam :http://store.steampowered.com/hwsurvey/ با توجه موارد ذکر شده، در زمان اتمام پروژه سخت افزارها و سیستم عامل مورد نیاز متداول خواهند بود و سرمایه گذاری روی این API نوعی آینده نگری است.
گرافیک بازی های مدرن • تکنولوژی های متداول بازی های مدرن • Big, Dynamic, Interactive worlds • Per-Pixel lighting, Diffuse, Normal, Specular, Ambient, Illumination, Reflection, Displacement Maps • HDR Tonemapping, Bloom • Motion Blur • Depth of Field • Skeletal, Morph animation • Shadows • Effects: Decals, Particles, Water, …
Shaders • دوران Fixed Pipeline مدتهاست گذشته است • D3D10+ فقط از شیدرها پشتیبانی می کند • اکثر افکت های نامبرده شده فقط توسط شیدر قابل پیاده سازی می باشند • آرتیست باید با شیدرها و ابزارهای مربوطه آشنایی داشته باشند (ShaderFX, Mental Mill, FXComposer, RenderMonkey) • Pipeline ها و موتورهای گرافیکی باید تولید، انتقال و نمایش شیدرها را به نحو مناسب پشتیبانی کنند
نکات مهم در طراحی Pipeline • سرعت انتقال محتوا از نرم افزارهای تولید محتوای سه بعدی (3dsmax, maya,…) به موتور بازی • کوتاه و ساده بودن چرخه تکرار بین موتور و نرم افزار سه بعدی • هر فردی با ابزارهای مختص خودش راحتتر است و ترجیحا مراحل باید در همان نرم افزارهای مورد استفاده انجام شود • کاهش احتمال خطای انسانی با حذف مراحل میانی در فرآیند انتقال محتوا و همچنین خودکار سازی آنها (اجتناب از انجام مراحل دستی) • آنچه هنرمند در ابزار طراحی خود می بیند با آنچه در موتور گرافیک ترسیم می شود یکسان باشد (WYSIWYG) • قابلیت اعمال فرآیندهای بهینه سازی به صورت خودکار در هر قسمت از Pipeline فراهم باشد • انعطاف پذیر باشد و تغییرات مورد نظر در Pipeline به سادگی قابل اجرا باشد • سیستم متریال یکپارچه برای انتقال متریال اجسام از نرم افزار سه بعدی به موتور گرافیک
راهکار موتور توچال • سه نوع شیدر (Deferred، Forward، Forward:3dsmax) • ShaderAuthor tool • Shader Repository • 3dsmax Exporter برای فرمت سه بعدی خاص موتور بازی • پشتیبانی از COLLADA ، فرمت مبادله محتوا • مدل همانطور که در نرم افزارهای سه بعدی دیده می شود، در موتور نمایش داده شود WYSIWYG • پیاده سازی سیستم متریال یکپارچه برای 3dsmax و موتور گرافیک (FX material) • قابلیت پردازش، بهینه سازی محتوا و فایلهای مربوطه (تکسچرهاو...) هنگام Export به صورت خودکار
Exporting Solutions • روش ها و فرمت های متداول (FBXو Colladaوx mesh...) مشکلات • Game /GPU Friendly نبودن این فرمتها • وجود اطلاعات اضافه بسیار زیاد • نیاز به پردازش قابل توجه هنگام لود یا توسط برنامه واسط • کند بودن خواندن آنها • مشکلات اساسی در خواندن متریال های مبتنی بر شیدر و پشتیبانی ناقص از آنها • اکثر موتورهای مطرح فرمت خاص خود را دارند • برای ایجاد یک Pipleline مناسب وجود Exporter سودمند و گاهاً ضروری است
Tochal Exporter • تفاوت نحوه ذخیره سازی اطلاعات صحنه در max و موتور (GPU Friendliness) • فرمت خاص طراحی شده قابل ذخیره و بارگذاری به صورت متنی xml و باینری • قابلیت تبدیل تکسچرها به فرمت dds با فشرده سازی های مختلف • قابلیت انتخاب اطلاعات مختلف ورتکس های (POSITION, NORMAL, TEXCOORD,…) • قابلیت ذخیره سازی Skin و Boneو Hierarchy • ذخیره کلیه شیدرها و پارامترهای مورد استفاده • قابلیت تبدیل متریال های عادی به سیستم شیدر موتور توچال • تشخیص و اعلام خطاهای مهم (تکسچرهای بزرگ، مشکلات Mesh, Skin، عدم وجود تکسچر و...)
Tochal Exporter • Artists work with common image formats like TGA, PNG, JPG, … • Texture Compression: • Diffuse (No alpha): BC1 (DXT1), 6:1 RGB • Diffuse (With Alpha): BC2 (DXT3) / BC3(DXT5), 4:1 (RGBA) • Normal : BC5 (ATI2N) (D3D10 hw only), 4:1 (RG) • Specular: BC4 (ATI1N) (D3D10 hw only), 4:1 (R) • Ambient: BC4 (ATI1N) (D3D10 hw only), 4:1 (R)
Deferred Rendering - GBuffer Depth Normals Material (Not viewable) Color
Deferred Rendering – Gbuffer 2 • Depth : Depth Buffer - D32 (FLOAT) • Read depth value from depth buffer (zbuffer) • Reconstruct position (view space) from depth • Normals : R16_G16 => X,Y (FLOAT) • Read Normal(x,y) • Normal.z = sqrt(1.0f – x*x – y*y) • Color: R8_G8_B8 (Albedo), A8 (Specular Intensity) • Materials: Encoded UINT32
Deferred Rendering – Materials • Material : UINT32 • Bits (16…31) : Material Id • Bits(9…15) : Ambient Multiplier • Bits(0…8) : Reserved ! • We have bitwise operations in D3D10 Gbuffer (Material) AmbientColor SpecularColor SpecularFallout Illumination … Materials[] Material Id • Get Material Id • Read back from Materials[] • Maximum 4096 mtls (16bit) • Read from tbuffer (Fast!) (Lighting Phase) (Draw phase) Mesh
Deferred Rendering - Transparency • Impossible with deferred rendering • Render alpha blended objects with conventional forward rendering. • Transparency rendering is a hack afterall! • Sort from back to front • DepthEnable = TRUE • DepthWriteEnable = FALSE • Draw() • Exciting !!! Fast Order independent transparency (true transparency) possible with D3D11 + CS • http://developer.amd.com/gpu_assets/OIT%20and%20Indirect%20Illumination%20using%20DX11%20Linked%20Lists_forweb.ppsx • In near future: Icy caves, translucent creatures, glass houses, ….
Deferred Rendering - AA • MSAA + Deferred Rendering not possible with D3d9, used edge detecting/bluring post process effects, which is lame and slow ! • Possible with D3d10 but still tricky • Better and faster with D3d10.1 • Draw Gbuffer to multiple MSAA render targets • Use geometry shader edge detection or centeroid sampling • Mark edges • In lighting phase, for each marked edge, calculate 2x/4x/8x samples. For none marked edge, calculate for 1 sample. We are still working on it !
Deferred Rendering - Lighting • Tile based deferred lighting • Andrew Lauritzen - http://visual-computing.intel-research.net/art/publications/deferred_rendering/lauritzen_deferred_shading_siggraph_2010.pptx • Divide screen in tiles • Cull screen space lights with each tile • Do deferred lighting • Repeat for next tile
Deferred Rendering - Performance • Scene ~ 350k triangles – PSSM Shadows • Intel Core2 E5300 (low-end) • ATI – 4850 (mid-range) • 200 Lights - 1024x768 – 133fps • 100 Lights – 1024x768 – 200fps • 1000 Lights – 1024x768 – 31 fps • 1 Light (sun) – 1024x768 – 302 fps • Still room for more optimization • Isn’t it NICE ?! • Throw dynamic lights everywhere. Explosions, gun fire, car head lights, city lights, etc.
Shadows - PSSM • PSSM is just Cascaded shadow maps with efficient frustum spliting scheme • Split view frustum in N parts with PSSM splitting scheme • Adjust imaginary sun position on the bounding sphere of the world • Detect shadow caster/receiver objects in each split from light’s point of view • Draw shadow maps for each split (total N shadow maps) • When rendering objects, read back from proper shadow map within position range
Shadows – PSSM 2 Reference: Fan Zhang, Haniqiu Sun, Oskari Nyman, GPU Gems 3 – Chapter 10 Fan Zhang PSSM Page : http://appsrv.cse.cuhk.edu.hk/~fzhang/pssm_project/ PSSM Frustum splitting scheme
Shadows – PSSM 3 • PROS • Best looking shadows on big outdoor environments • Preseves shadow quality within the whole view range • Used in many big games : Red dead redemption, Assassin’s Creed, KillZone2, Battlefield2, … • CONS • Very GPU/CPU intensive (usually 3-4 big shadow map renders, and 3-4 shadow map read backs with branching, culling, etc.)
Shadows – PSSM – Speed Problem • Here comes D3D10 ! • Used methods presented in GPU Gems 3 • Using D3D10 specific stuff • Texture Arrays, SampleCmpLevelZero() • Geometry shaders • D3D10 Instancing • Branching (also applicable to D3d9 sm3.0 hw) • With the help of D3D10 : Generating 4 CSM shadow maps from … 80 Objects ~ 400 Draw calls 4 Render target changes 80 Objects ~ 100 Draw calls 1 Render target change ~ 3x speed increase D3D9 D3D10/10.1
Shadows – PSSM – What else ? • Anti-Jittering: we currently do additional simple 4-tap PCF sampling (not good enough). mixing with variance shadow maps (or even MSAA shadow maps) would be nicer. • What else needs to be done ? A lot ! • Stabilize jitters • Better fitting of split frustums to shadow maps • Peter-Panning, Shadow acne • More optimization (especially on CPU side) 4-Tap PCF Peter-Panning
In Development • HDR: • 64bit Float format • Histogram generation. (Median method used in HL2) • Tonemapping • Bloom • Particles : • Deferred particles (smaller buffer, less fill-rate intensive) • Soft particles
In Development • Skinning/Animation: • Hardware accelerated (no actual bone limit in D3D10) • Havok Animation • Terrain:
Terrain • وقت نشد این قسمت را کامل کنیم • الگوریتم رندر و LOD مشابه Geo-MipMap • با الهام از روش استفاده شده در موتور FrostBite (BFBC, BFBC2) • برای تولید متریال زمین از روشهای پیشرفته Shader Splatting و ویرایشگر Node Based مانند Terragen2 و World Machineو... اما به صورت Real-time استفاده شده است
دمو • برنامه نویس: سپهر تقدیسیان علی سیداف • گرافیست: مهام بری بهزاد حسین زاده
اطلاعات پروژه • وبلاگ توسعه بازی: http://www.tochalco.com/blog • فرصت های شغلی موجود برای نیروهای برنامه نویس، گرافیست،... (تماس از طریق ایمیل) jobs@tochalco.com