C++ OpenGL - 叠加示例
C++ OpenGL - Overlay example
我有一个 OpenGL 应用程序(迷宫式)需要尽快处理。我目前的问题如下:
- 我的主 window 上有 3 个子 window,它们都工作正常。显然我应该只使用一个 subwindow 并且左侧的 subwindows(较小的)应该显示为覆盖。我的实际应用程序具有以下 window 显示:
我想做这样的事情:
我已经在互联网上搜索过,但到目前为止我还没有找到关于这个主题的任何信息。有什么地方可以让我了解如何解决这个问题吗?
非常感谢。
您可以将叠加层渲染为纹理,然后将其渲染到屏幕上任何您想要的位置。查看 gl*FrameBuffer 函数。它可能看起来像这样:
// Create a texture to render to
glGenTextures(1, &overlay_tex);
glBindTexture(GL_TEXTURE_2D, overlay_tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
// NULL means reserve texture memory
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
glGenFramebuffers(1, &fb);
glBindFramebuffer(GL_FRAMEBUFFER, fb);
// Attach the texture to the framebuffer
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, overlay_tex, 0);
glGenRenderbuffers(1, &depth_rb);
glBindRenderbuffer(GL_RENDERBUFFER, depth_rb);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_rb);
glBindFramebuffer(GL_FRAMEBUFFER, fb);
// Render your overlay here
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// Render to the backbuffer again
我有一个 OpenGL 应用程序(迷宫式)需要尽快处理。我目前的问题如下:
- 我的主 window 上有 3 个子 window,它们都工作正常。显然我应该只使用一个 subwindow 并且左侧的 subwindows(较小的)应该显示为覆盖。我的实际应用程序具有以下 window 显示:
我想做这样的事情:
我已经在互联网上搜索过,但到目前为止我还没有找到关于这个主题的任何信息。有什么地方可以让我了解如何解决这个问题吗?
非常感谢。
您可以将叠加层渲染为纹理,然后将其渲染到屏幕上任何您想要的位置。查看 gl*FrameBuffer 函数。它可能看起来像这样:
// Create a texture to render to
glGenTextures(1, &overlay_tex);
glBindTexture(GL_TEXTURE_2D, overlay_tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
// NULL means reserve texture memory
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
glGenFramebuffers(1, &fb);
glBindFramebuffer(GL_FRAMEBUFFER, fb);
// Attach the texture to the framebuffer
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, overlay_tex, 0);
glGenRenderbuffers(1, &depth_rb);
glBindRenderbuffer(GL_RENDERBUFFER, depth_rb);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_rb);
glBindFramebuffer(GL_FRAMEBUFFER, fb);
// Render your overlay here
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// Render to the backbuffer again