Diligent Core 是一種現代跨平台低階圖形 API,它構成了 Diligent Engine 的基礎。此模組實現 Direct3D11、Direct3D12、OpenGL、OpenGLES 和 Vulkan 渲染後端(商業客戶可使用 Metal 實作)以及基本的特定於平台的實用程式。它是獨立的,可以自己建造。請參閱主存儲庫,以了解有關支援的平台和功能、建置說明等的資訊。
平台 | 建置狀態 |
---|---|
Win32 | |
通用Windows | |
Linux | |
安卓 | |
蘋果系統 | |
iOS系統 | |
電視作業系統 | |
恩腳本 |
克隆儲存庫
API基礎知識
管道資源佈局
Win32
通用Windows平台
Linux
蘋果系統
安卓
iOS系統
恩腳本
摧毀發動機
初始化引擎
創建資源
建立著色器
初始化管道狀態
綁定著色器資源
設定管道狀態並呼叫Draw指令
低階 API 互通性
NuGet 套件建置說明
執照
貢獻
發布歷史
若要取得儲存庫和所有子模組,請使用下列命令:
git clone --recursive https://github.com/DiligentGraphics/DiligentCore.git
若要建置模組,請參閱主儲存庫中的建置說明。
在使用引擎提供的任何功能之前,您需要建立渲染設備、直接上下文和交換鏈。
在Win32平台上,您可以建立OpenGL、Direct3D11、Direct3D12或Vulkan設備,如下所示:
無效InitializeDiligentEngine(HWND NativeWindowHandle) { SwapChainDesc SCDesc;// RefCntAutoPtr<IRenderDevice> m_pDevice;// RefCntAutoPtr<IDeviceContext> m_pImmediateContext;// RefCntAutoPtr<ISwapChain> m_pSwin;switch; {案例RENDER_DEVICE_TYPE_D3D11: { EngineD3D11CreateInfo EngineCI; # if ENGINE_DLL// 載入dll並導入GetEngineFactoryD3D11()函數auto* GetEngineFactoryD3D11 = LoadGraphicsEngineD3D11(); # endifauto* pFactoryD3D11 = GetEngineFactoryD3D11(); pFactoryD3D11->CreateDeviceAndContextsD3D11(EngineCI, &m_pDevice, &m_pImmediateContext); Win32NativeWindow 視窗{hWnd}; pFactoryD3D11->CreateSwapChainD3D11(m_pDevice, m_pImmediateContext, SCDesc, FullScreenModeDesc{}, 視窗, &m_pSwapChain); }break;case RENDER_DEVICE_TYPE_D3D12: { # if ENGINE_DLL//載入dll並導入GetEngineFactoryD3D12()函數auto GetEngineFactoryD3D12 = LoadGraphicsEngineD3D12(); # endifEngineD3D12CreateInfo EngineCI;auto* pFactoryD3D12 = GetEngineFactoryD3D12(); pFactoryD3D12->CreateDeviceAndContextsD3D12(EngineCI, &m_pDevice, &m_pImmediateContext); Win32NativeWindow 視窗{hWnd}; pFactoryD3D12->CreateSwapChainD3D12(m_pDevice, m_pImmediateContext, SCDesc, FullScreenModeDesc{}, 視窗, &m_pSwapChain); }break;case RENDER_DEVICE_TYPE_GL: { # if EXPLICITLY_LOAD_ENGINE_GL_DLL//載入dll並匯入GetEngineFactoryOpenGL()函數auto GetEngineFactoryOpenGL = LoadGraphicsEngineOpenGL(); # endifauto* pFactoryOpenGL = GetEngineFactoryOpenGL(); EngineGLCreateInfo EngineCI; EngineCI.Window.hWnd = hWnd; pFactoryOpenGL->CreateDeviceAndSwapChainGL(EngineCI, &m_pDevice, &m_pImmediateContext, SCDesc, &m_pSwapChain); }break;case RENDER_DEVICE_TYPE_VULKAN: { # if EXPLICITLY_LOAD_ENGINE_VK_DLL//載入dll並匯入GetEngineFactoryVk()函數auto GetEngineFactoryVk = LoadGraphicsEngineVk(); # endifEngineVkCreateInfo EngineCI;auto* pFactoryVk = GetEngineFactoryVk(); pFactoryVk->CreateDeviceAndContextsVk(EngineCI, &m_pDevice, &m_pImmediateContext); Win32NativeWindow 視窗{hWnd}; pFactoryVk->CreateSwapChainVk(m_pDevice, m_pImmediateContext, SCDesc, Window, &m_pSwapChain); }中斷;預設: std::cerr << "未知裝置類型"; } }
在 Windows 上,引擎可以靜態連結到應用程式或建置為單獨的 DLL。在第一種情況下,可以直接呼叫工廠函數GetEngineFactoryOpenGL()
、 GetEngineFactoryD3D11()
、 GetEngineFactoryD3D12()
和GetEngineFactoryVk()
。在第二種情況下,您需要使用LoadGraphicsEngineOpenGL()
、 LoadGraphicsEngineD3D11()
、 LoadGraphicsEngineD3D12()
或LoadGraphicsEngineVk()
函數將 DLL 載入到進程的位址空間中。每個函數載入適當的動態函式庫並導入初始化引擎所需的函數。您需要包含以下標頭:
#include“EngineFactoryD3D11.h”#include“EngineFactoryD3D12.h”#include“EngineFactoryOpenGL.h”#include“EngineFactoryVk.h”
您還需要將以下目錄新增至包含搜尋路徑:
DiligentCore/Graphics/GraphicsEngineD3D11/interface
DiligentCore/Graphics/GraphicsEngineD3D12/interface
DiligentCore/Graphics/GraphicsEngineOpenGL/interface
DiligentCore/Graphics/GraphicsEngineVulkan/interface
作為替代方案,您可以只新增根資料夾的路徑,然後使用相對於它的包含路徑。
啟用Diligent
命名空間:
使用命名空間 Diligent;
IEngineFactoryD3D11::CreateDeviceAndContextsD3D11()
、 IEngineFactoryD3D12::CreateDeviceAndContextsD3D12()
和IEngineFactoryVk::CreateDeviceAndContextsVk()
函數還可以指定數量的上下文和延遲的上下文。上下文只能在引擎初始化期間建立。此函數填入指向上下文的指標數組,其中首先是立即上下文,然後是所有延遲上下文。
有關更多詳細信息,請查看Tutorial00_HelloWin32.cpp 檔案。
在通用Windows平台上,您可以建立Direct3D11或Direct3D12裝置。初始化的執行方式與 Win32 平台上相同。差別在於,您首先透過呼叫IEngineFactoryD3D11::CreateDeviceAndContextsD3D11()
或IEngineFactoryD3D12::CreateDeviceAndContextsD3D12()
來建立渲染裝置和裝置上下文。稍後透過呼叫IEngineFactoryD3D11::CreateSwapChainD3D11()
或IEngineFactoryD3D12::CreateSwapChainD3D12()
來建立交換鏈。請查看 SampleAppUWP.cpp 檔案以了解更多詳細資訊。
在Linux平台上,該引擎支援OpenGL和Vulkan後端。 Linux 上 GL 上下文的初始化與視窗建立緊密結合。因此,Diligent Engine 不會初始化上下文,而是附加到應用程式初始化的上下文。 Linux 上的引擎初始化範例可以在Tutorial00_HelloLinux.cpp 中找到。
在 MacOS 上,Diligent Engine 支援 OpenGL、Vulkan 和 Metal 後端。 MacOS 上 GL 上下文的初始化由應用程式執行,引擎附加到應用程式創建的上下文;詳細資訊請參閱 GLView.mm。 Vulkan 後端的初始化與其他平台類似。請參閱 MetalView.mm。
在 Android 上,您可以建立 OpenGLES 或 Vulkan 裝置。以下程式碼片段顯示了一個範例:
自動* pFactoryOpenGL = GetEngineFactoryOpenGL(); EngineGLCreateInfo EngineCI; EngineCI.Window.pAWindow = NativeWindowHandle; pFactoryOpenGL->CreateDeviceAndSwapChainGL( EngineCI、&m_pDevice、&m_pContext、SCDesc、&m_pSwapChain);
如果引擎建置為動態庫,則需要由本機活動載入該庫。以下程式碼顯示了一種可能的方法:
靜態{嘗試{System.loadLibrary(“GraphicsEngineOpenGL”); } catch (UnsatisfiedLinkError e) {Log.e("native-activity", "無法載入 GraphicsEngineOpenGL 函式庫.n" + e); } }
iOS 實作支援 OpenGLES、Vulkan 和 Metal 後端。 iOS上GL上下文的初始化由應用程式執行,引擎附加到應用程式初始化的上下文;詳細資訊請參閱 EAGLView.mm。
在 Emscripten 上,您可以建立 OpenGLES 裝置。以下程式碼片段顯示了一個範例:
//需要將畫布的id傳給NativeWindowauto* pFactoryOpenGL = GetEngineFactoryOpenGL(); EngineGLCreateInfo EngineCI = {}; EngineCI.Window = NativeWindow{"#canvas"}; pFactoryOpenGL->CreateDeviceAndSwapChainGL(EngineCI, &m_pDevice, &m_pContext, SCDesc, &m_pSwapChain);
如果您在現有上下文中使用 SDL 或 GLFW,則可以提供 null 作為本機視窗句柄: EngineCI.Window = NativeWindow{nullptr}
引擎執行自動引用計數,並在釋放對引擎物件的最後一個引用時關閉。
設備資源由渲染設備建立。兩種主要資源類型是緩衝區(代表線性記憶體)和紋理(使用針對快速過濾而最佳化的記憶體佈局)。要建立緩衝區,您需要填入BufferDesc
結構並呼叫IRenderDevice::CreateBuffer()
。以下程式碼建立一個統一(恆定)緩衝區:
緩衝區描述 緩衝區描述; BufferDesc.Name = "統一緩衝區"; BuffDesc.BindFlags = BIND_UNIFORM_BUFFER; BuffDesc.Usage = USAGE_DYNAMIC; BuffDesc.uiSizeInBytes = sizeof(ShaderConstants); BuffDesc.CPUAccessFlags = CPU_ACCESS_WRITE; m_pDevice->CreateBuffer(BuffDesc, nullptr, &m_pConstantBuffer);
類似地,要建立紋理,請填入TextureDesc
結構並呼叫IRenderDevice::CreateTexture()
,如下例所示:
紋理描述 紋理描述; TexDesc.Name = "我的紋理 2D"; TexDesc.Type = TEXTURE_TYPE_2D; TexDesc.Width = 1024; TexDesc.Height = 1024; TexDesc.Format = TEX_FORMAT_RGBA8_UNORM; TexDesc.Usage = USAGE_DEFAULT; TexDesc.BindFlags = BIND_SHADER_RESOURCE | TexDesc.BindFlags = BIND_SHADER_RESOURCE | BIND_RENDER_TARGET | BIND_RENDER_TARGET | BIND_UNORDERED_ACCESS; TexDesc.Name = "範例 2D 紋理"; m_pRenderDevice->CreateTexture(TexDesc, nullptr, &m_pTestTex);
只有一個函數CreateTexture()
能夠創造出所有類型的紋理。類型、格式、陣列大小和所有其他參數均由TextureDesc
結構的成員指定。
對於紋理建立期間指定的每個綁定標誌,紋理物件都會建立一個預設視圖。預設著色器資源視圖引用整個紋理,預設渲染目標和深度模板視圖引用最詳細的 mip 層級中的所有陣列切片,無序存取視圖引用整個紋理。若要從紋理取得預設視圖,請使用ITexture::GetDefaultView()
函數。請注意,此函數不會增加返回介面的參考計數器。您可以使用ITexture::CreateView()
建立其他紋理視圖。使用IBuffer::CreateView()
建立緩衝區的附加視圖。
若要建立著色器,請填入ShaderCreateInfo
結構:
ShaderCreateInfo ShaderCI;
創建著色器的方法有3種。第一種方法是透過ShaderCreateInfo::Source
成員提供指向著色器原始碼的指標。第二種方法是提供檔案名稱。第三種方法是透過ShaderCreateInfo::ByteCode
成員提供指向已編譯字節碼的指標。圖形引擎與平台完全解耦。由於主機檔案系統依賴平台,因此該結構公開ShaderCreateInfo::pShaderSourceStreamFactory
成員,旨在為引擎提供對檔案系統的存取權。如果提供了來源檔案名,則還必須提供指向著色器來源流工廠的非空指標。如果著色器來源包含任何#include
指令,來源流工廠也將用於載入這些檔案。該引擎為每個受支援的平台提供預設實現,這在大多數情況下應該就足夠了。不過,您可以定義自己的實作。
一個重要的成員是ShaderCreateInfo::SourceLanguage
。以下是該成員的有效值:
SHADER_SOURCE_LANGUAGE_DEFAULT
- 著色器來源格式與底層圖形 API 相符:用於 D3D11 或 D3D12 模式的 HLSL,以及用於 OpenGL、OpenGLES 和 Vulkan 模式的 GLSL。
SHADER_SOURCE_LANGUAGE_HLSL
- 著色器來源採用 HLSL。對於 OpenGL 和 OpenGLES 模式,原始碼將轉換為 GLSL。在Vulkan後端,程式碼將直接編譯為SPIRV。
SHADER_SOURCE_LANGUAGE_GLSL
- 著色器來源採用 GLSL。
SHADER_SOURCE_LANGUAGE_GLSL_VERBATIM
- 著色器原始語言是 GLSL,應逐字編譯。
SHADER_SOURCE_LANGUAGE_MSL
- 來源語言是金屬著色語言。
ShaderCreateInfo
結構的其他成員定義著色器,包括搜尋目錄、著色器巨集定義、著色器入口點和其他參數。
ShaderMacroHelper 巨集; Macros.AddShaderMacro("USE_SHADOWS", 1); Macros.AddShaderMacro("NUM_SHADOW_SAMPLES", 4); 宏.Finalize(); ShaderCI.Macros = 巨集;
當一切準備就緒後,呼叫IRenderDevice::CreateShader()
建立著色器物件:
ShaderCreateInfo ShaderCI; ShaderCI.Desc.Name = "MyPixelShader"; ShaderCI.FilePath = "MyShaderFile.fx"; ShaderCI.EntryPoint = "MyPixelShader"; ShaderCI.Desc.ShaderType = SHADER_TYPE_PIXEL; ShaderCI.SourceLanguage = SHADER_SOURCE_LANGUAGE_HLSL;const auto* SearchDirectories =「著色器;著色器inc;」; RefCntAutoPtr<IShaderSourceInputStreamFactory> pShaderSourceFactory; m_pEngineFactory->CreateDefaultShaderSourceStreamFactory(SearchDirectories, &pShaderSourceFactory); ShaderCI.pShaderSourceStreamFactory = pShaderSourceFactory; RefCntAutoPtr<IShader> pShader; m_pDevice->CreateShader(ShaderCI, &pShader);
Diligent Engine遵循Direct3D12/Vulkan風格來配置圖形/計算管道。一個整體管道狀態物件 (PSO) 包含所有必要的狀態(所有著色器階段、輸入佈局描述、深度模板、光柵器和混合狀態描述等)。若要建立圖形管道狀態對象,請定義GraphicsPipelineStateCreateInfo
結構的實例:
GraphicsPipelineStateCreateInfo PSOCreateInfo; PipelineStateDesc& PSODesc = PSOCreateInfo.PSODesc; PSODesc.Name = "我的管道狀態";
描述管道細節,例如渲染目標的數量和格式以及深度模板格式:
// 這是一個圖形管道PSODesc.PipelineType = PIPELINE_TYPE_GRAPHICS; PSOCreateInfo.GraphicsPipeline.NumRenderTargets = 1; PSOCreateInfo.GraphicsPipeline.RTVFormats[0] = TEX_FORMAT_RGBA8_UNORM_SRGB; PSOCreateInfo.GraphicsPipeline.DSVFormat = TEX_FORMAT_D32_FLOAT;
初始化深度模板狀態描述DepthStencilStateDesc
。請注意,建構函式使用預設值初始化成員,您只能設定與預設值不同的成員。
// 初始化深度模板狀態DepthStencilStateDesc& DepthStencilDesc = PSOCreateInfo.GraphicsPipeline.DepthStencilDesc; DepthStencilDesc.DepthEnable = true; DepthStencilDesc.DepthWriteEnable = true;
初始化混合狀態描述BlendStateDesc
:
// 初始化混合狀態BlendStateDesc& BSDesc = PSOCreateInfo.GraphicsPipeline.BlendDesc; BSDesc.IndependentBlendEnable = False;auto &RT0 = BSDesc.RenderTargets[0]; RT0.BlendEnable = True; RT0.RenderTargetWriteMask = COLOR_MASK_ALL; RT0.SrcBlend = BLEND_FACTOR_SRC_ALPHA; RT0.DestBlend = BLEND_FACTOR_INV_SRC_ALPHA; RT0.BlendOp = BLEND_OPERATION_ADD; RT0.SrcBlendAlpha = BLEND_FACTOR_SRC_ALPHA; RT0.DestBlendAlpha = BLEND_FACTOR_INV_SRC_ALPHA; RT0.BlendOpAlpha = BLEND_OPERATION_ADD;
初始化光柵器狀態描述RasterizerStateDesc
:
// 初始化光柵化器 stateRasterizerStateDesc& RasterizerDesc = PSOCreateInfo.GraphicsPipeline.RasterizerDesc; RasterizerDesc.FillMode = FILL_MODE_SOLID; RasterizerDesc.CullMode = CULL_MODE_NONE; RasterizerDesc.FrontCounterClockwise = True; RasterizerDesc.ScissorEnable = True; RasterizerDesc.AntialiasedLineEnable = False;
初始化輸入佈局描述InputLayoutDesc
:
// 定義輸入佈局InputLayoutDesc& Layout = PSOCreateInfo.GraphicsPipeline.InputLayout; 佈局元素 佈局元素[] = {LayoutElement( 0, 0, 3, VT_FLOAT32, 假 ),LayoutElement( 1, 0, 4, VT_UINT8, True ),LayoutElement( 2, 0, 2, VT_FLOAT32, 假 ), }; Layout.LayoutElements = LayoutElems; Layout.NumElements = _countof(LayoutElems);
定義基元拓撲並設定著色器指標:
// 定義著色器和圖元拓樸PSOCreateInfo.GraphicsPipeline.PrimitiveTopology = PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; PSOCreateInfo.pVS = m_pVS; PSOCreateInfo.pPS = m_pPS;
管道資源佈局通知引擎應用程式將如何使用不同的著色器資源變數。為了允許根據資源綁定變更的預期頻率對資源進行分組,Diligent Engine 引入了著色器變數的分類:
靜態變數( SHADER_RESOURCE_VARIABLE_TYPE_STATIC
) 是預期只設定一次的變數。一旦資源綁定到變量,它們就不能更改。此類變數旨在保存全域常數,例如相機屬性或全域光屬性常數緩衝區。請注意,資源綁定可能不會更改,而資源的內容允許根據其使用情況進行更改。
可變變數( SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE
) 定義預期按材質頻率變更的資源。範例可能包括漫反射紋理、法線貼圖等。
動態變數( SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC
) 預計會頻繁且隨機地變更。
若要定義變數類型,請準備ShaderResourceVariableDesc
結構陣列並初始化PSODesc.ResourceLayout.Variables
和PSODesc.ResourceLayout.NumVariables
成員。 PSODesc.ResourceLayout.DefaultVariableType
也可用於設定未提供變數名稱時將使用的類型。
ShaderResourceVariableDesc ShaderVars[] = { {SHADER_TYPE_PIXEL,“g_StaticTexture”,SHADER_RESOURCE_VARIABLE_TYPE_STATIC}, {SHADER_TYPE_PIXEL,“g_MutableTexture”,SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE}, {SHADER_TYPE_PIXEL、「g_DynamicTexture」、SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC} }; PSODesc.ResourceLayout.Variables = ShaderVars; PSODesc.ResourceLayout.NumVariables = _countof(ShaderVars); PSODesc.ResourceLayout.DefaultVariableType = SHADER_RESOURCE_VARIABLE_TYPE_STATIC;
建立管道狀態時,可以為紋理永久分配不可變的取樣器。如果將不可變採樣器指派給紋理,則將始終使用該採樣器,而不是在紋理著色器資源視圖中初始化的採樣器。若要定義不可變採樣器,請準備ImmutableSamplerDesc
結構陣列並初始化PSODesc.ResourceLayout.ImmutableSamplers
和PSODesc.ResourceLayout.NumImmutableSamplers
成員。請注意,不可變採樣器可以分配給任何類型的紋理變量,不一定是靜態的,以便可以在運行時更改紋理綁定,而採樣器將保持不可變。強烈建議盡可能使用不可變採樣器。
不可變取樣器描述 ImtblSampler; ImtblSampler.ShaderStages = SHADER_TYPE_PIXEL; ImtblSampler.Desc.MinFilter = FILTER_TYPE_LINEAR; ImtblSampler.Desc.MagFilter = FILTER_TYPE_LINEAR; ImtblSampler.Desc.MipFilter = FILTER_TYPE_LINEAR; ImtblSampler.TextureName = "g_MutableTexture"; PSODesc.ResourceLayout.NumImmutableSamplers = 1; PSODesc.ResourceLayout.ImmutableSamplers = &ImtblSampler;
本文檔提供了有關使用紋理採樣器的詳細資訊。
當 PSO 描述結構的所有必填欄位設定完成後,呼叫IRenderDevice::CreateGraphicsPipelineState()
建立 PSO 物件:
m_pDevice->CreateGraphicsPipelineState(PSOCreateInfo, &m_pPSO);
如上所述,Diligent Engine 中的著色器資源綁定是基於將變數分組為 3 個不同群組(靜態、可變和動態)。靜態變數是預期僅設定一次的變數。一旦資源綁定到變量,它們就不能更改。此類變數旨在保存全域常數,例如相機屬性或全域光屬性常數緩衝區。它們直接綁定到管道狀態物件:
m_pPSO->GetStaticShaderVariable(SHADER_TYPE_PIXEL, "g_tex2DShadowMap")->Set(pShadowMapSRV);
可變變數和動態變數透過名為 Shader Resource Binding (SRB) 的新物件進行綁定,該物件是由管道狀態 ( IPipelineState::CreateShaderResourceBinding()
)或高階用例中的管道資源簽章所建立的:
m_pPSO->CreateShaderResourceBinding(&m_pSRB, true);
第二個參數告訴系統初始化 SRB 物件中引用 PSO 中靜態變數的內部結構。
然後透過 SRB 物件綁定動態和可變資源:
m_pSRB->GetVariable(SHADER_TYPE_PIXEL, "tex2DDiffuse")->Set(pDiffuseTexSRV); m_pSRB->GetVariable(SHADER_TYPE_VERTEX, "cbRandomAttribs")->Set(pRandomAttrsCB);
可變資源和動態資源之間的差異在於,可變資源只能為著色器資源綁定的每個實例設定一次。動態資源可以設定多次。正確設定變數類型很重要,因為這會影響效能。靜態變數和可變變數效率更高。動態變數更昂貴並且會引入一些運行時開銷。
綁定著色器資源的另一種方法是建立一個IResourceMapping
接口,將資源文字名稱對應到實際資源:
資源映射條目條目[] = { {“g_Texture”,pTexture->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE)} }; ResourceMappingCreateInfo ResMappingCI; ResMappingCI.pEntries = 條目; ResMappingCI.NumEntries = _countof(Entries); RefCntAutoPtr<IResourceMapping> pResMapping; pRenderDevice->CreateResourceMapping(ResMappingCI, &pResMapping);
然後,資源映射可用於綁定管道狀態中的所有靜態資源( IPipelineState::BindStaticResources()
):
m_pPSO->BindStaticResources(SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, pResMapping, BIND_SHADER_RESOURCES_VERIFY_ALL_RESOLVED);
或著色器資源綁定中的所有可變和動態資源 ( IShaderResourceBinding::BindResources()
):
m_pSRB->BindResources(SHADER_TYPE_VERTEX | SHADER_TYPE_PIXEL, pResMapping, BIND_SHADER_RESOURCES_VERIFY_ALL_RESOLVED);
所有BindResources()
函數的最後一個參數定義如何解析資源:
BIND_SHADER_RESOURCES_UPDATE_STATIC
- 指示要更新靜態變數綁定。
BIND_SHADER_RESOURCES_UPDATE_MUTABLE
- 指示要更新可變變數綁定。
BIND_SHADER_RESOURCES_UPDATE_DYNAMIC
- 指示要更新動態變數綁定。
BIND_SHADER_RESOURCES_UPDATE_ALL
- 指示要更新所有變數類型(靜態、可變和動態)。請注意,如果未設定BIND_SHADER_RESOURCES_UPDATE_STATIC
、 BIND_SHADER_RESOURCES_UPDATE_MUTABLE
和BIND_SHADER_RESOURCES_UPDATE_DYNAMIC
標誌,則所有變數類型都會更新,就像指定了BIND_SHADER_RESOURCES_UPDATE_ALL
一樣。
BIND_SHADER_RESOURCES_KEEP_EXISTING
- 如果指定此標誌,則僅更新未解析的綁定。所有現有的綁定將保留其原始值。如果未指定此標誌,則如果對應包含相應的資源,則每個著色器變數都會被更新。
BIND_SHADER_RESOURCES_VERIFY_ALL_RESOLVED
- 如果指定此標誌,則預計在呼叫後解析所有著色器綁定。如果不是這種情況,則會報告錯誤。
可以使用不同的資源映射多次呼叫BindResources()
來綁定資源。但是,建議使用大型資源映射,因為映射的大小不會影響元素搜尋時間。
引擎執行運行時檢查以驗證是否綁定了正確的資源。例如,如果您嘗試將常數緩衝區綁定到著色器資源視圖變量,則會將錯誤輸出到偵錯控制台。
在調用任何繪製命令之前,所有必需的頂點和索引緩衝區以及管道狀態都應綁定到設備上下文:
// 在發出任何繪製指令之前設定渲染目標。 m_pContext->SetRenderTargets(1, &pRTV, pDSV, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);// 清除渲染目標與深度模板常數 float Zero[4] = {0, 0, 0, 0}; m_pContext->ClearRenderTarget(pRTV, ClearColor, RESOURCE_STATE_TRANSITION_MODE_TRANSITION); m_pContext->ClearDepthStencil(pDSV, CLEAR_DEPTH_FLAG, 1.f, 0, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);// 設定頂點和索引緩衝區IBuffer* buffer[] = {m_pVertexBuffer}; Uint32 偏移[] = {0}; m_pContext->SetVertexBuffers(0, 1, 緩衝區, 偏移量, SET_VERTEX_BUFFERS_FLAG_RESET, RESOURCE_STATE_TRANSITION_MODE_TRANSITION); m_pContext->SetIndexBuffer(m_pIndexBuffer, 0, RESOURCE_STATE_TRANSITION_MODE_TRANSITION); m_pContext->SetPipelineState(m_pPSO);
所有可能需要執行資源狀態轉換的方法都採用RESOURCE_STATE_TRANSITION_MODE
枚舉作為參數。枚舉定義了以下模式:
RESOURCE_STATE_TRANSITION_MODE_NONE
- 不執行資源狀態轉換。
RESOURCE_STATE_TRANSITION_MODE_TRANSITION
- 將資源轉換到指令所需的狀態。
RESOURCE_STATE_TRANSITION_MODE_VERIFY
- 不轉換,但驗證狀態是否正確。
最後一步是將著色器資源提交到設備上下文。這是透過IDeviceContext::CommitShaderResources()
方法完成的:
m_pContext->CommitShaderResources(m_pSRB, COMMIT_SHADER_RESOURCES_FLAG_TRANSITION_RESOURCES);
如果未呼叫該方法,引擎將偵測到資源未提交並輸出偵錯訊息。請注意,最後一個參數告訴系統將資源轉換到正確的狀態。如果未指定此標誌,則必須透過呼叫IDeviceContext::TransitionShaderResources()
將資源明確轉換為所需狀態:
m_pContext->TransitionShaderResources(m_pPSO, m_pSRB);
請注意,該方法需要指向建立著色器資源綁定的管道狀態的指標。
當所有必要的狀態和資源都綁定後, IDeviceContext::DrawIndexed()
可用於執行繪製指令,或IDeviceContext::DispatchCompute()
可用於執行計算指令。請注意,對於繪製命令,必須綁定圖形管道,對於調度命令,必須綁定計算管道。 DrawIndexed()
將DrawIndexedAttribs
結構作為參數,例如:
DrawIndexedAttribs attrs; attrs.IndexType = VT_UINT16; attrs.NumIndices = 36; attrs.Flags = DRAW_FLAG_VERIFY_STATES; pContext->DrawIndexed(attrs);
DRAW_FLAG_VERIFY_STATES
標誌指示引擎驗證繪製指令使用的頂點和索引緩衝區是否已轉換到正確的狀態。
DispatchCompute()
採用定義計算網格維度的DispatchComputeAttribs
結構:
m_pContext->SetPipelineState(m_pComputePSO); m_pContext->CommitShaderResources(m_pComputeSRB, COMMIT_SHADER_RESOURCES_FLAG_TRANSITION_RESOURCES); DispatchComputeAttribs DispatchAttrs{64, 64, 8}; m_pContext->DispatchCompute(DispatchAttrs);
您可以透過學習範例和教學課程來了解更多有關引擎 API 的資訊。
Diligent Engine 廣泛支援與底層低階 API 的互通性。該引擎可以透過附加到現有的 D3D11/D3D12 裝置或 OpenGL/GLES 上下文來初始化,並提供對底層本機 API 物件的存取。請參閱以下頁面以了解更多資訊:
Direct3D11 互通性
Direct3D12 互通性
OpenGL/GLES 互通性
Vulkan 互通性
請依照以下步驟建置 NuGet 套件:
安裝所需的Python包
python -m pip install -r ./BuildTools/.NET/requirements.txt
執行 NuGet 套件建置腳本,例如:
python ./BuildTools/.NET/dotnet-build-package.py -c Debug -d ./
爭論 | 描述 | 必需的 |
---|---|---|
-c ( configuration ) | 本機動態庫建置配置(例如偵錯、發布等) | 是的 |
-d ( root-dir ) | DiligentCore根目錄路徑 | 是的 |
-s ( settings ) | 設定檔案的路徑 | 不 |
dotnet-tests | 指示是否執行 .NET 測試的標誌 | 不 |
dotnet-publish | 指示是否將套件發佈到 NuGet Gallery 的標誌 | 不 |
free-memory | 如果在建置過程中遇到記憶體不足的情況,請使用此參數 | 不 |
您可以使用設定檔覆寫預設值(檢查dotnet-build-package.py
中的default_settings
字典)
請參閱 Apache 2.0 許可證。
該項目有一些第三方依賴項,每個依賴項都可能具有獨立的許可:
Vulkan-Headers:Vulkan 頭檔和 API 註冊表(Apache 許可證 2.0)。
SPIRV-Cross:SPIRV 解析與交叉編譯工具(Apache 授權 2.0)。
SPIRV-Heads:SPIRV 頭檔(類似 Khronos MIT 的許可證)。
SPIRV-Tools:SPIRV 最佳化和驗證工具(Apache 授權 2.0)。
glslang:適用於 GLSL、ESSL 和 HLSL 的 Khronos 參考編譯器和驗證器(3 條款 BSD 授權、2 條款 BSD 授權、MIT、Apache 授權 2.0)。
glew:OpenGL 擴充牧馬人函式庫(Mesa 3-D 圖庫,類似 Khronos MIT 的授權)。
volk:Vulkan API 的元載入器(類似 Arseny Kapoulkine MIT 的授權)。
stb:用於 C/C++ 的 stb 單一檔案公共網域庫(MIT 授權或公共網域)。
googletest:Google 測試和模擬框架(BSD 3 條款「新」或「修訂」許可證)。
DirectXShaderCompiler:基於 LLVM/Clang 的 DirectX Shader 編譯器(LLVM 發行授權)。
DXBCChecksum:AMD 開發工具團隊 (MIT lincesne) 的 DXBC 校驗和計算演算法。
xxHash:極快的非加密雜湊演算法(2-Clause BSD 許可證)。
要貢獻您的程式碼,請向此儲存庫提交拉取請求。 Diligent Engine依據 Apache 2.0 授權分發,保證DiligentCore儲存庫中的內容不存在智慧財產權負擔。在向此儲存庫提交任何內容時,您將根據相同的條款對該內容進行許可,並且您同意該內容不存在任何智慧財產權聲明,並且您有權根據這些條款對其進行許可。
Diligent Engine 使用 clang-format 來確保整個程式碼庫中原始程式碼風格的一致性。 CI 對每個提交和拉取請求都會驗證格式,如果發現任何程式碼格式問題,建置將會失敗。請參閱此頁面,以了解如何設定 clang-format 和自動程式碼格式化的說明。
查看發布歷史記錄
diligentgraphics.com