विषय-सूची
- प्रस्तावना
- ग्राफिक्स प्रोग्रामिंग सीखना
- छोटी-मोटी समस्याओं में न उलझना
- Vulkan ही क्यों?
- Vulkan सीखना
- इंजन का अवलोकन और फ्रेम विश्लेषण
- सामान्य सलाह
- अनुशंसित Vulkan लाइब्रेरी
- GfxDevice abstraction
- shader प्रोसेसिंग
- push constants, descriptor sets और bindless descriptors
- pipeline patterns
- Programmable Vertex Pulling (PVP) + Buffer Device Address (BDA) का उपयोग
- bindless descriptors
- हर frame अपलोड होने वाले dynamic data को संभालना
- destructor, deletion queue और cleanup
- synchronization
- और अधिक implementation notes
- बहुत सारे sprites ड्रॉ करना
- compute skinning
- game / renderer अलगाव
- scene loading और entity prefabs
- MSAA
- UI
- Dear ImGui और sRGB समस्याएँ
- अन्य बातें
- Vulkan में स्विच करने से क्या मिला
- आगे का काम
प्रस्तावना
- यह Vulkan सीखकर एक छोटा गेम इंजन लिखने के अनुभव का दस्तावेज़ है।
- इस पर Vulkan के पूर्व ज्ञान के बिना 3 महीने तक काम किया गया।
- एक छोटा 3D गेम बनाया गया और पुन: उपयोग योग्य हिस्सों को इंजन के रूप में अलग किया गया।
ग्राफिक्स प्रोग्रामिंग सीखना
- जो लोग पहली बार ग्राफिक्स प्रोग्रामिंग शुरू कर रहे हैं, उनके लिए OpenGL से सीखना बेहतर है।
- OpenGL के माध्यम से texture वाले models को स्क्रीन पर दिखाना और simple lighting तथा shadow mapping सीखना उपयोगी है।
- OpenGL सीखने के लिए अनुशंसित resources:
- learnopengl.com
- Anton’s OpenGL 4 Tutorials पुस्तक
- Thorsten Thormählen के lectures (पहले 6 वीडियो अनुशंसित)
छोटी-मोटी समस्याओं में न उलझना
- छोटी-मोटी समस्याओं में फँसने से बचने के लिए सावधान रहना चाहिए।
- हमेशा अपने आप से पूछना चाहिए: "क्या यह सच में ज़रूरी है?", "क्या यह bottleneck बनेगा?"
- जो फीचर अभी ज़रूरी नहीं हैं, उन्हें बाद में जोड़ा जा सकता है।
- सरल गेम से शुरू करना चाहिए और बहुत जटिल इंजन बनाने से बचना चाहिए।
Vulkan ही क्यों?
- Vulkan आधुनिक GPU features का उपयोग करने देता है और open source तकनीकों तथा standards को पसंद करने वालों के लिए उपयुक्त है।
- OpenGL छोटे गेम्स के लिए काफ़ी है, लेकिन आधुनिक GPU features का उपयोग करना मुश्किल है, और macOS में इसका उपयोग सीमित है।
- WebGPU, Vulkan की तुलना में सीखना आसान है और browser में गेम चलाने की सुविधा देता है।
Vulkan सीखना
- Vulkan सीखना शुरुआत में कठिन लगा, लेकिन Khronos ने जटिल हिस्सों को सरल बनाया और उपयोगी लाइब्रेरी उपलब्ध कराईं, जिससे सीखना आसान हुआ।
- Vulkan सीखने के लिए अनुशंसित resources:
- vkguide
- TU Wien की Vulkan lecture series
- 3D Graphics Rendering Cookbook पुस्तक
- Mastering Graphics Programming with Vulkan पुस्तक
इंजन का अवलोकन और फ्रेम विश्लेषण
- इंजन का नाम EDBR (Elias Daler’s Bikeshed Engine) है, और इसकी शुरुआत Vulkan learning project के रूप में हुई।
- यह इंजन मुख्य रूप से छोटे level-based games के लिए उपयुक्त है।
- frame rendering प्रक्रिया:
- skinning: compute shader का उपयोग करके model skinning प्रोसेस करना
- shadow mapping: 4096x4096 depth texture का उपयोग
- geometry और shading: PBR model का उपयोग
- depth resolve: fragment shader के माध्यम से manually प्रोसेस करना
- post-processing effects: depth fog, tone mapping, bloom लागू करना
- UI: एक draw call में UI ड्रॉ करना
सामान्य सलाह
अनुशंसित Vulkan लाइब्रेरी
- vk-bootstrap: Vulkan initialization code को सरल बनाता है
- Vulkan Memory Allocator (VMA): memory allocation प्रबंधन
- volk: extension function loading को सरल बनाता है
GfxDevice abstraction
GfxDevice class Vulkan सुविधाओं को encapsulate करती है, और Vulkan context initialization, swapchain creation और management आदि को संभालती है।
shader प्रोसेसिंग
- shader लिखने के लिए GLSL का उपयोग किया जाता है।
- runtime dependency कम करने के लिए build चरण में shader को पहले से compile किया जाता है।
push constants, descriptor sets और bindless descriptors
- Vulkan में shader को data देने के लिए descriptor sets का उपयोग किया जाता है।
- bindless descriptors और Buffer Device Address का उपयोग करके descriptor set का उपयोग न्यूनतम किया जाता है।
pipeline patterns
- drawing चरणों को अलग करने के लिए pipeline classes का उपयोग किया जाता है।
init, cleanup, draw methods के माध्यम से pipeline initialization, cleanup और drawing संभाली जाती है।
Programmable Vertex Pulling (PVP) + Buffer Device Address (BDA) का उपयोग
- vertex type को एक जैसा रखा जाता है, और shader में vertices को सीधे access किया जाता है।
- push constants का उपयोग करके buffer address पास किया जाता है।
bindless descriptors
- textures को bindless तरीके से manage किया जाता है ताकि shader में उन्हें सीधे access किया जा सके।
- texture ID को push constants के रूप में पास करके sampling की जाती है।
GN⁺ की राय
- Vulkan उच्च performance और आधुनिक GPU features देता है, लेकिन इसकी शुरुआती learning curve काफ़ी steep है।
- पहले OpenGL सीखने के बाद Vulkan पर जाना बेहतर है।
- Vulkan सीखने के लिए कई resources उपलब्ध हैं, और उनका उपयोग करने पर सीखना आसान हो जाता है।
- Vulkan का उपयोग करके छोटा गेम इंजन लिखना, graphics programming को गहराई से समझने में मदद करता है।
- Vulkan की जटिलता कम करने के लिए उपयोगी लाइब्रेरी का इस्तेमाल करना अच्छा है।
1 टिप्पणियां
Hacker News प्रतिक्रिया
Hacker News टिप्पणियों का सारांश
Minimal approach का प्रभाव: एक मेटावर्स क्लाइंट Rust में लिखा जा रहा है, और Vulkan, WGPU, Rend3 का उपयोग करते हुए जटिल समस्याओं का सामना करना पड़ रहा है। WGPU कई प्लेटफ़ॉर्म सपोर्ट करने की कोशिश के कारण डेवलप करना कठिन है.
Vulkan के फायदे और OpenGL की सरलता: Vulkan उन्नत GPU फीचर्स का अधिकतम उपयोग कर सकता है, लेकिन OpenGL सरल 2D/लो-पॉली गेम्स के लिए उपयुक्त है। AAA गेम इंडस्ट्री ग्राफ़िक्स क्वालिटी पर ज़ोर देती है, लेकिन कई खिलाड़ियों की दिलचस्पी गेमप्ले में अधिक होती है.
सिर्फ़ ज़रूरी फीचर्स लागू करना: जूनियर प्रोग्रामर अक्सर नए टूल्स और "best practices" पर अटक जाते हैं, लेकिन असली समस्या हल करने के लिए आवश्यक न्यूनतम फीचर्स पर ध्यान देना ज़्यादा महत्वपूर्ण है.
Vulkan की जटिलता: OpenGL की तुलना में Vulkan में performance optimize करना कठिन है, और इसमें बहुत सारा कोड व synchronization काम चाहिए। हॉबी प्रोजेक्ट्स के लिए OpenGL ES3 अधिक सरल है.
अतिरिक्त abstraction layers की समस्या: Vulkan सीखाने वाली सामग्रियाँ अक्सर अतिरिक्त abstraction layers जोड़ देती हैं, जिससे बेसिक memory management उदाहरण ढूंढना मुश्किल हो जाता है.
Vulkan सीखने की कठिनाई: OpenGL सीखना आसान था, लेकिन Vulkan साधारण कामों को भी जटिल बना देता है। नई तकनीक सीखने में बहुत समय लगता है.
वैज्ञानिक डेटा visualization के लिए Vulkan सीखना: Vulkan सीखकर वैज्ञानिक डेटा visualization engine लिखा गया, और सीखने की प्रक्रिया में कई abstractions को समझने में समय लगा.
Vulkan सीखने की मुश्किलें: असली engine में Vulkan का उपयोग कैसे किया जाए, यह समझना कठिन है। अच्छी abstractions और rendering order तय करने के तरीके सीखने के लिए अधिक सामग्री की ज़रूरत है.
ग्राफ़िक्स प्रोग्रामिंग कम्युनिटी का समर्थन: Vulkan engine विकसित करने की प्रक्रिया में community का support और feedback बहुत मददगार रहा.