【问题标题】:Rendering only a part of the window onto a framebuffer in opengl仅将窗口的一部分渲染到opengl中的帧缓冲区
【发布时间】:2022-01-06 10:43:06
【问题描述】:

我一直想在 opengl(使用 c++)中使用帧缓冲区制作编辑菜单。然后我在菜单空间中渲染一些按钮,然后渲染帧缓冲区。因此,在创建帧缓冲区时,我只希望它能够仅读取和绘制屏幕的一部分(例如 X1 和 X2 以及 Y1 和 Y2 之间的坐标),然后将其转换为纹理附件。 问题是我不如何渲染与窗口尺寸不同大小的帧缓冲区。所以我需要知道如何实现这一点。

我认为需要更改的代码是这 3 行:

  1. glRenderBufferStorageMultiSample(GL_FRAMEBUFFER, 4, GL_RGB, SCREEN_WIDTH, SCREEN_HEIGHT);
  2. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCREEN_WIDTH, SCREEN_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
  3. glBlitFrameBuffer(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0,0,SCREEN_WIDTH, SCREEN_HEIGHT, GL_COLOR_BUFFER_BIT, GL_NEAREST);

【问题讨论】:

    标签: c++ opengl opengl-3


    【解决方案1】:

    您需要启用scissor clipping

    启用测试后,只有位于剪刀框内的像素可以通过绘图命令进行修改。

    在绘制按钮之前

    glEnable(GL_SCISSOR_TEST);
    glScissor(x1, y1, width, height);
    

    一旦你完成了按钮的绘制

    glDisable(GL_SCISSOR_TEST);
    

    【讨论】:

    • 我不确定这将如何工作,因为即使您只绘制按钮,纹理附件仍需要调整大小以适合帧缓冲区。但是通过一些实验,我得到了它的工作。我将纹理大小设置为菜单大小和 glBlitFrameBuffer (X1, Y1, X2, Y2, 0, 0, X2 - X1 , Y2 - Y1);基本上告诉它从帧缓冲区中的特定矩形读取。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    相关资源
    最近更新 更多