2-设置贴图的颜色通道

我在尝试将纹理贴图(如深度贴图)传递给ImGui时,发现它把RGB都显示出来了,如下:

查阅相关资料后,发现可以用 swizzling (GL_TEXTURE_SWIZZLE_RGBA)来解决。

// Texture must be bound first
tex->bind(1);
GLint swizzle[4] = {
	GL_RED,		// Shader Red   channel source = Texture Red
	GL_RED,		// Shader Green channel source = Texture Green
	GL_RED,		// Shader Blue  channel source = Texture Blue
	GL_ONE		// Shader Alpha channel source = One
};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
tex->unbind();

如上述代码所示,我们可以通过swizzle操作去主动设定纹理的输出通道,上边我们把纹理的RGBA改成RRR1,这样输出结果就是我们想要的:

我去,贴图怎么反了,应该是ImGui::Image()的问题,解决办法是修改它的参数:

// 修改前
ImGui::Image((void*)my_texture, ImVec2(256, 256), ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f)); // Default coordinates
// 修改后(翻转一下UV)
ImGui::Image((void*)my_texture, ImVec2(256, 256), ImVec2(0.0f, 1.0f), ImVec2(1.0f, 0.0f)); // Flip Y coordinates

参考资料

  • How to disable alpha in ImGui::Image? · Issue #4730 · ocornut/imgui (github.com)
  • glTexParameter - OpenGL 4 - docs.gl