从0到1掌握DiligentCore:开发者必须知道的10个核心概念

从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. 命令提交与执行

渲染命令通过设备上下文提交,典型流程包括:

  1. 设置渲染目标和深度模板缓冲区
  2. 清除渲染目标和深度模板
  3. 设置顶点和索引缓冲区
  4. 设置管线状态
  5. 提交着色器资源
  6. 执行绘制命令
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),仅供参考