从0到1掌握DiligentCore:开发者必须知道的10个核心概念
从0到1掌握DiligentCore:开发者必须知道的10个核心概念
【免费下载链接】DiligentCoreA modern cross-platform low-level graphics API项目地址: https://gitcode.com/gh_mirrors/di/DiligentCore
DiligentCore是一个现代、跨平台的低级图形API,构成了Diligent Engine的基础。它为Direct3D11、Direct3D12、OpenGL、OpenGLES、Vulkan和WebGPU渲染后端提供实现,是开发者构建高性能图形应用的强大工具。
DiligentCore标志,代表现代跨平台图形编程的核心
1. 跨平台渲染后端架构
DiligentCore的核心优势在于其多后端支持,能够无缝适配多种图形API。项目结构中包含针对不同API的实现模块:
- Direct3D11:Graphics/GraphicsEngineD3D11/
- Direct3D12:Graphics/GraphicsEngineD3D12/
- Vulkan:Graphics/GraphicsEngineVulkan/
- OpenGL:Graphics/GraphicsEngineOpenGL/
- WebGPU:Graphics/GraphicsEngineWebGPU/
这种架构允许开发者编写一次代码,在Windows、Linux、macOS、Android、iOS和Web等多个平台上运行,无需重写图形相关逻辑。
2. 设备与上下文初始化
使用DiligentCore的第一步是创建渲染设备和设备上下文。设备负责资源创建,而上下文用于提交渲染命令。以下是初始化流程的关键步骤:
// 伪代码示例 auto* pFactory = LoadAndGetEngineFactoryVk(); // 加载特定后端工厂 pFactory->CreateDeviceAndContextsVk(EngineCI, &m_pDevice, &m_pImmediateContext);不同平台有细微差异,但核心API保持一致。例如,Win32平台需要窗口句柄,而Android平台则需要ANativeWindow指针。
3. 资源创建与管理
DiligentCore将图形资源分为缓冲区(Buffer)和纹理(Texture)两大类:
缓冲区:用于存储顶点数据、索引数据和常量数据
BufferDesc BuffDesc; BuffDesc.BindFlags = BIND_UNIFORM_BUFFER; BuffDesc.Usage = USAGE_DYNAMIC; m_pDevice->CreateBuffer(BuffDesc, nullptr, &m_pConstantBuffer);纹理:用于存储图像数据,支持2D、3D、立方体等多种类型
TextureDesc TexDesc; TexDesc.Type = TEXTURE_TYPE_2D; TexDesc.Format = TEX_FORMAT_RGBA8_UNORM; m_pRenderDevice->CreateTexture(TexDesc, nullptr, &m_pTestTex);
资源创建通过统一的接口进行,无需关心底层API的具体实现细节。
4. 着色器编译与管理
DiligentCore支持多种着色器语言,包括HLSL、GLSL和MSL,并提供了灵活的着色器创建机制:
- 多语言支持:通过
ShaderCreateInfo::SourceLanguage指定着色器语言 - 预处理与宏定义:支持
#include指令和着色器宏 - 字节码缓存:可通过BytecodeCache实现编译结果缓存
ShaderCreateInfo ShaderCI; ShaderCI.FilePath = "MyShaderFile.fx"; ShaderCI.EntryPoint = "MyPixelShader"; ShaderCI.Desc.ShaderType = SHADER_TYPE_PIXEL; ShaderCI.SourceLanguage = SHADER_SOURCE_LANGUAGE_HLSL; m_pDevice->CreateShader(ShaderCI, &pShader);5. 管线状态对象(PSO)
DiligentCore采用现代图形API的管线状态对象概念,将所有渲染状态集中管理:
- 包含着色器阶段、输入布局、混合状态、深度模板状态、光栅化状态等
- 通过
GraphicsPipelineStateCreateInfo结构体配置 - 支持图形管线和计算管线
GraphicsPipelineStateCreateInfo PSOCreateInfo; PSOCreateInfo.GraphicsPipeline.NumRenderTargets = 1; PSOCreateInfo.GraphicsPipeline.RTVFormats[0] = TEX_FORMAT_RGBA8_UNORM_SRGB; PSOCreateInfo.pVS = m_pVS; // 顶点着色器 PSOCreateInfo.pPS = m_pPS; // 像素着色器 m_pDevice->CreateGraphicsPipelineState(PSOCreateInfo, &m_pPSO);6. 资源绑定模型
DiligentCore引入了创新的资源绑定模型,将着色器变量分为三类:
- 静态变量(SHADER_RESOURCE_VARIABLE_TYPE_STATIC):绑定后不再更改,直接绑定到PSO
- 可变变量(SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE):按材质频率更改,通过ShaderResourceBinding(SRB)绑定
- 动态变量(SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC):频繁更改,通过SRB绑定
// 静态变量绑定 m_pPSO->GetStaticShaderVariable(SHADER_TYPE_PIXEL, "g_tex2DShadowMap")->Set(pShadowMapSRV); // 创建SRB并绑定可变/动态变量 m_pPSO->CreateShaderResourceBinding(&m_pSRB, true); m_pSRB->GetVariable(SHADER_TYPE_PIXEL, "tex2DDiffuse")->Set(pDiffuseTexSRV);7. 命令提交与执行
渲染命令通过设备上下文提交,典型流程包括:
- 设置渲染目标和深度模板缓冲区
- 清除渲染目标和深度模板
- 设置顶点和索引缓冲区
- 设置管线状态
- 提交着色器资源
- 执行绘制命令
m_pContext->SetRenderTargets(1, &pRTV, pDSV, RESOURCE_STATE_TRANSITION_MODE_TRANSITION); m_pContext->ClearRenderTarget(pRTV, ClearColor, RESOURCE_STATE_TRANSITION_MODE_TRANSITION); m_pContext->SetPipelineState(m_pPSO); m_pContext->CommitShaderResources(m_pSRB, COMMIT_SHADER_RESOURCES_FLAG_TRANSITION_RESOURCES); m_pContext->DrawIndexed(attrs);8. 资源状态转换
DiligentCore提供了资源状态管理机制,确保资源在正确的状态下被访问:
- 通过
RESOURCE_STATE_TRANSITION_MODE控制状态转换 - 支持自动转换和手动验证两种模式
- 减少因状态错误导致的渲染问题
// 自动转换资源状态 m_pContext->SetVertexBuffers(0, 1, buffer, offsets, SET_VERTEX_BUFFERS_FLAG_RESET, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);9. 低级API互操作性
DiligentCore允许与底层图形API直接交互,提供最大灵活性:
- 支持从现有D3D11/D3D12设备或OpenGL上下文初始化
- 提供访问原生API对象的接口
- 可在DiligentCore和原生API之间共享资源
详细互操作性指南可参考各后端目录下的文档,如Direct3D12互操作性。
10. 工具与辅助功能
DiligentCore包含多种工具和辅助功能,简化开发流程:
- GraphicsTools:提供常用图形功能,如动态纹理图集、GPU上传管理器等
- HLSL2GLSLConverterLib:实现HLSL到GLSL的转换,简化跨平台开发
- SuperResolution:集成FSR等超分辨率技术
- 测试框架:完善的单元测试和集成测试
DiligentCore支持包括tvOS在内的多种平台
快速开始指南
要开始使用DiligentCore,只需克隆仓库并按照构建说明进行:
git clone --recursive https://gitcode.com/gh_mirrors/di/DiligentCore项目提供了丰富的示例和教程,帮助开发者快速掌握核心概念。通过理解上述10个核心概念,您将能够充分利用DiligentCore的强大功能,构建高性能、跨平台的图形应用。
DiligentCore前瞻性地支持VisionOS等新兴平台
无论是开发游戏、实时渲染应用还是专业图形工具,DiligentCore都能提供坚实的基础,帮助您在各种平台上实现卓越的图形效果。
【免费下载链接】DiligentCoreA modern cross-platform low-level graphics API项目地址: https://gitcode.com/gh_mirrors/di/DiligentCore
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考