यहां वुलकन और डायरेक्टएक्स 12. की एक गैर-संपूर्ण सूची है। इसे नाथन के समान मानदंडों का उपयोग करके एक साथ जोड़ा गया है।
कुल मिलाकर दोनों एपीआई आश्चर्यजनक रूप से समान हैं। Shader चरणों जैसी चीजें DX11 और OpenGL से अपरिवर्तित रहती हैं। और जाहिर है, डायरेक्टएक्स चीज़ों को शादियों को दिखाई देने के लिए उपयोग करता है। वल्कन भी विचारों का उपयोग करता है, लेकिन वे लगातार कम होते हैं।
Shader दृश्यता व्यवहार दोनों के बीच थोड़ा भिन्न होता है। वल्कन यह निर्धारित करने के लिए एक मास्क का उपयोग करता है कि क्या एक विवरणक विभिन्न शेडर चरणों के लिए दिखाई देता है। DX12 इसे थोड़ा अलग तरीके से संभालता है, संसाधन दृश्यता या तो एकल चरण या सभी चरणों में की जाती है।
मैंने सबसे अच्छा नीचे दिए गए डिस्क्रिप्टर सेट / रूट पैरामीटर सामान को तोड़ दिया। डिस्क्रिप्टिव हैंडलिंग उन क्षेत्रों में से एक है जो दो एपीआई के बीच बहुत भिन्न होता है। हालांकि, अंतिम परिणाम काफी समान है।
एपीआई मूल बातें
Vulkan DirectX 12
--------------- ---------------
n/a IDXGIFactory4
VkInstance n/a
VkPhysicalDevice IDXGIAdapter1
VkDevice ID3D12Device
VkQueue ID3D12CommandQueue
VkSwapchain IDXGISwapChain3
VkFormat DXGI_FORMAT
SPIR-V D3D12_SHADER_BYTECODE
VkFence fences
VkSemaphore n/a
VkEvent n/a
वल्कन की डब्ल्यूएसआई परत स्वेपचिन के लिए छवियों की आपूर्ति करती है। DX12 को छवि का प्रतिनिधित्व करने के लिए निर्माण संसाधनों की आवश्यकता होती है।
सामान्य कतार व्यवहार दोनों के बीच समान है। कई थ्रेड्स से सबमिट करते समय थोड़ा सा आइडिओसिंक्रसे होता है।
के रूप में मैं और अधिक सामान याद अद्यतन करने की कोशिश करेंगे ...
कमांड बफर और पूल
Vulkan DirectX 12
--------------- ---------------
VkCommandPool ID3D12CommandAllocator
VkCommandBuffer ID3D12CommandList/ID3D12GraphicsCommandList
वल्कन / DX12 डॉक्स से कमांड पूल / एलोकेटर के बारे में जानकारी बहुत भिन्न शब्दों में व्यवहार को बताती है - लेकिन वास्तविक व्यवहार काफी समान है। उपयोगकर्ता पूल से कई कमांड बफ़र / सूची आवंटित करने के लिए स्वतंत्र हैं। हालांकि, पूल से केवल एक कमांड बफर / सूची रिकॉर्डिंग की जा सकती है। थ्रेड्स के बीच पूल साझा नहीं किए जा सकते। इसलिए कई थ्रेड्स के लिए कई पूलों की आवश्यकता होती है। आप दोनों पर कमांड बफर / सूची जमा करने के तुरंत बाद रिकॉर्डिंग भी शुरू कर सकते हैं।
DX12 कमांड सूची एक खुले राज्य में बनाई गई हैं। मुझे यह थोड़ा परेशान करने वाला लगता है क्योंकि मैं वल्कन का इस्तेमाल कर रहा हूं। DX12 को कमांड एलोकेटर और कमांड लिस्ट को भी रीसेट करने की आवश्यकता होती है। यह वल्कन में एक वैकल्पिक व्यवहार है।
वर्णनकर्ता
Vulkan DirectX 12
--------------- ---------------
VkDescriptorPool n/a
VkDescriptorSet n/a
VkDescriptorSetLayout n/a
VkDescriptorSetLayoutBinding RootParameter**
n/a ID3D12DescriptorHeap
** रूटपैरमीटर - VkDescriptorSetLayoutBinding के समान सटीक लेकिन बड़ी तस्वीर में समान सोच नहीं है।
VkDescriptorPool और ID3D12DescriptorHeaps इसी तरह के हैं (धन्यवाद निकोलस) जिसमें वे दोनों खुद को डिस्क्रिप्टर के आवंटन का प्रबंधन करते हैं।
यह ध्यान दिया जाना चाहिए कि डीएक्स 12 केवल किसी भी समय कमांड की सूची में बंधे दो डिस्क्रिप्टर हीप्स का समर्थन करता है। एक CBVSRVUAV और एक नमूना। आपके पास कई डिस्क्रिप्टर टेबल हो सकते हैं, जैसा कि आप इन ढेरों को संदर्भित करना चाहते हैं।
वल्कन की ओर, डिस्क्रिप्टर सेट की अधिकतम संख्या के लिए एक कठिन सीमा है जो आप डिस्क्रिप्टर पूल को बताते हैं। दोनों पर आपको पूल / हीप के प्रकार प्रति विवरणकों की संख्या पर थोड़ा सा मैनुअल अकाउंटिंग करना होगा। वर्णकों के प्रकार के साथ वल्कन भी अधिक स्पष्ट है। जबकि DX12 के वर्णनकर्ता या तो CBVSRVUAV या नमूना हैं।
DX12 में एक सुविधा भी है जहां आप SetGraphicsRootConstantBufferView का उपयोग करके मक्खी पर CBV को बांध सकते हैं। हालाँकि, इस का SRV संस्करण, SetGraphicsRootShaderResourceView, बनावट पर काम नहीं करता है। यह डॉक्स में है - लेकिन अगर आपको सावधान पाठक नहीं हैं तो यह पता लगाने में आपको कुछ घंटे लग सकते हैं।
पाइपलाइन
Vulkan DirectX 12
--------------- ---------------
VkPipelineLayout RootSignature***
VkPipeline ID3D12PipelineState
VkVertexInputAttributeDescription D3D12_INPUT_ELEMENT_DESC
VkVertexInputBindingDescription "
* ** RootSignature - नहीं करने के लिए एक सटीक बराबर VkPipelineLayout ।
DX12 एक विवरण में शीर्ष विशेषता और बाध्यकारी को जोड़ती है।
छवियाँ और बफर
Vulkan DirectX 12
--------------- ---------------
VkImage ID3D12Resource
VkBuffer ID3D12Resource
uniform buffer constant buffer
index buffer index buffer
vertex buffer vertex buffer
VkSampler sampler
barriers/transitions barriers/transitions
दोनों एपीआई पर बाधाएं थोड़ी अलग हैं, लेकिन इसका समान परिणाम है।
RenderPasses / RenderTargets
Vulkan DirectX 12
--------------- ---------------
VkRenderPass render pass
VkFramebuffer collection of ID3D12Resource
subpass n/a
n/a render target
वल्कन रेंडर पास में एक अच्छा ऑटो-रिज़ॉल्यूशन फीचर है। DX12 में यह AFIAK नहीं है। दोनों एपीआई मैनुअल समाधान के लिए कार्य प्रदान करते हैं।
DX12 में VkFramebuffer और किसी भी ऑब्जेक्ट के बीच कोई सीधा तालमेल नहीं है। ID3D12Resource का एक संग्रह जो RTVs के लिए मैप करता है, एक ढीला समानता है।
VkFramebuffer एक अनुक्रमणिका का उपयोग करके VkRenderPass संदर्भों की तरह कम या ज्यादा अनुलग्नक पूल का कार्य करता है। VkRenderPass के भीतर सबपास एक VkFramebuffer में किसी भी अटैचमेंट को संदर्भित कर सकता है, यह मानते हुए कि एक ही अटैचमेंट एक बार से अधिक सबपास नहीं है। एक बार में उपयोग किए जाने वाले रंग अनुलग्नकों की अधिकतम संख्या VkPhysicalDeviceLimits.maxColorAttachments तक सीमित है।
DX12 के रेंडर टारगेट सिर्फ RTV हैं जो एक ID3D12Resource ऑब्जेक्ट द्वारा समर्थित हैं। एक बार उपयोग किए गए रंग अनुलग्नकों की अधिकतम संख्या D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT (8) तक सीमित है।
दोनों एपीआई के लिए आपको पाइपलाइन ऑब्जेक्ट्स के निर्माण पर रेंडर टारगेट / पास निर्दिष्ट करने की आवश्यकता होती है। हालाँकि, वुलकन आपको संगत रेंडर पास का उपयोग करने की अनुमति देता है, इसलिए आप पाइपलाइन निर्माण के दौरान आपके द्वारा निर्दिष्ट किए गए लॉक नहीं हैं। मैंने इसे DX12 पर परीक्षण नहीं किया है, लेकिन मुझे लगता है कि यह सिर्फ एक RTV है, यह DX12 पर भी सच है।