未完待续
前言
加载一张图片到 GPU texture 已经超出 Dear ImGui 的范围,更多的是与图形 API 有关,但是 Dear ImGui 的用户经常遇到这个问题,因此提供一个文档。
这个文档将展示如何从磁盘上加载一张图片,并将其显示到 Dear ImGui window 上。
我们将加载这张图片:(MyImage01.jpg)
通常需要以下两步:
从磁盘加载一张图片到内存。在这个例子中,我们解压图片成为 RGBA 格式。可以使用
std_image.h
库来完成;从内存中加载 RGBA 图片到 GPU texture。你将使用图形 API(例如 OpenGL,DirectX11)来完成。
当 GPU texture memory 中存在一张图片,你可以使用 ImGui::Image()
去请求 Dear ImGui 创建一个 draw command,之后 Dear ImGui rendering back-end 将生成一个 draw call。
渲染游戏场景到 texture
这个文档介绍了从磁盘加载一张图片文件,并且导入 GPU texture。另一个频繁使用 textures 的情况是,渲染你的应用/游戏场景到 texture,并且将 texture 展示在 Dear ImGui 窗口内。
该文档目前不覆盖这部分内容。
关于文件
两件事情需要注意:
在 C/C++ 和大多数编程语言中,如果你想要在字符串文字使用反斜杠
\
,你需要写两个反斜杠\\
。碰巧,Windows 使用反斜杠作为路径分隔符,所以要注意。
filename = "C:\MyFiles\MyImage01.jpg" // This is INCORRECT!!
filename = "C:\\MyFiles\\MyImage01.jpg" // This is CORRECT
在一些情况,你在 Windows 下也可以使用 /
路径分隔符。
确保你的 IDE/debugger 从正确的工作目录启动你的可执行文件。在 Visual Studio, 你可以在
Properties > General > Debugging > Working Directory
里改变你的工作目录。
filename = "MyImage01.jpg"; // Relative filename depends on your Working Directory when running your program!
filename = "../MyImage01.jpg"; // Load from parent folder
ImTextureId
给诸如
ImGui::Image()
,ImGui::ImageButton()
或者低水平ImDrawList::AddImage()
的函数传递自己的 textures,触发 draw calls。实际 textures 的识别方式取决于用户/引擎。这些标识符被存储作为 ImTextureID 值传递。
从磁盘加载图像文件并将其转换为纹理不在 Dear ImGui 的范围内。你可以阅读有关图形 API 的文档或教程来了解如何上传纹理。在本文档中,你将找到一些示例。
完整解释:
Dear ImGui 的工作是创建 "meshes",由 draw commands 和 vertices 组成,以渲染无关的格式定义。在帧的最后,这些 meshes (ImDrawList) 将由渲染函数显示。它们由纹理多边形组成,渲染它们的代码通常非常短(几十行)。我们将提供常见图形 API 的示例(OpenGL, DirectX, etc)。
每个渲染函数决定一个数据类型表示 "textures"。"texture" 的概念与你的底层引擎/图形 API 有关。我们携带信息去识别 ImTextureID 类型中的 "texture"。ImTextureID 默认是 ImU64,也就是 8 字节的数据:只够存 1 个指针或者你选择的一个整数。Dear ImGui 不知道你存储什么在 ImTextureID 中,它传递 ImTextureID 值,直到到达你的渲染函数。
OpenGL: ImTextureID = GLuint (see ImGui_ImplOpenGL3_RenderDrawData() in imgui_impl_opengl3.cpp)
DirectX9: ImTextureID = LPDIRECT3DTEXTURE9 (see ImGui_ImplDX9_RenderDrawData() in imgui_impl_dx9.cpp)
DirectX11: ImTextureID = ID3D11ShaderResourceView* (see ImGui_ImplDX11_RenderDrawData() in imgui_impl_dx11.cpp)
DirectX12: ImTextureID = D3D12_GPU_DESCRIPTOR_HANDLE (see ImGui_ImplDX12_RenderDrawData() in imgui_impl_dx12.cpp)
SDL_Renderer: ImTextureID = SDL_Texture* (see ImGui_ImplSDLRenderer2_RenderDrawData() in imgui_impl_sdlrenderer2.cpp)
Vulkan: ImTextureID = VkDescriptorSet (see ImGui_ImplVulkan_RenderDrawData() in imgui_impl_vulkan.cpp)
WebGPU: ImTextureID = WGPUTextureView (see ImGui_ImplWGPU_RenderDrawData() in imgui_impl_wgpu.cpp)