如何使用 opengl 从字节数组加载 ImGui 图像?

How to load ImGui image from byte array with opengl?

我正在尝试在我的 C++ ImGui 菜单中渲染图像;我相信结束代码会像 ImGui::Image(ImTextureID, ImVec2(X, Y));。我已经有一个包含我要渲染的图像的字节数组,但不知道如何将它加载到正在传入的 ImTextureID 中。我已经找到了如何使用 D3DXCreateTextureFromFileInMemoryEx 使用 Direct X 来完成它但需要知道执行此操作的 opengl 等价物。

ImGui::Image 中的 'ImTextureID' 只是一个 int,其值对应于在您的图形环境(DirectX 或 OpenGL)中生成的纹理。

在 OpenGL 中执行此操作的方法如下(我不熟悉 DirectX,但我敢打赌 'D3DXCreateTextureFromFileInMemoryEx' 的功能几乎相同):

  1. 使用glGenTextures()
  2. 生成纹理名称(这个'name'只是一个整数,而且是ImGui用作ImTextureID的整数)
  3. 使用 glTexParameteri() 为新生成的纹理设置 UV 采样参数
  4. 使用 glBindTexture() 将纹理绑定到当前活动的纹理单元
  5. 使用 glTexImage2D() 将像素数据上传到 GPU

通常看起来像这样:

int textureID;
glGenTextures(GL_TEXTURE_2D, 1, &textureID);
glTextureParameteri(textureID, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTextureParameteri(textureID, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTextureParameteri(textureID, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTextureParameteri(textureID, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, [width of your texture], [height of your texture], false, GL_RGBA, GL_FLOAT, [pointer to first element in array of texture pixel values]);

我已经有一段时间没有用 C++ 做这个了,所以我在一些细节上可能是错误的。但是文档非常好,最好还是阅读它以弄清楚如何使纹理与您打算输入的纹理数据类型兼容:https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml

像那样设置纹理后,您可以在 ImGui Image 调用中使用 textureID 的值。