是否可以定义';绘图面板';在opengl中直接绘制它们而不是窗口?

是否可以定义';绘图面板';在opengl中直接绘制它们而不是窗口?,opengl,panel,Opengl,Panel,我想知道以下内容是否可以在OpenGL中轻松实现: 将窗口分为多个面板 使用标准化坐标(0-1)将每个面板放置到位,以便在重新调整窗口大小时,面板将保持在正确的位置 直接绘制到先前定义的其中一个面板中 结果应该类似于下图: 到目前为止,我一直在直接将对象绘制到窗口中,用每个面板的相应值偏移坐标。然而,这似乎不是正确的做事方式。非常感谢经验丰富的开发人员提供的任何建议和示例代码 编辑:到目前为止,我所读到的,使用glScissor或glViewport可能是实现我想要的两种方法,但是我不知道这两

我想知道以下内容是否可以在OpenGL中轻松实现:

  • 将窗口分为多个面板
  • 使用标准化坐标(0-1)将每个面板放置到位,以便在重新调整窗口大小时,面板将保持在正确的位置
  • 直接绘制到先前定义的其中一个面板中
  • 结果应该类似于下图:

    到目前为止,我一直在直接将对象绘制到窗口中,用每个面板的相应值偏移坐标。然而,这似乎不是正确的做事方式。非常感谢经验丰富的开发人员提供的任何建议和示例代码

    编辑:到目前为止,我所读到的,使用
    glScissor
    glViewport
    可能是实现我想要的两种方法,但是我不知道这两种方法的优缺点(非常欢迎您的见解!)。此外,我更愿意定义某种类型的
    面板
    ,返回它的句柄并直接绘制到其中。

    如果使用
    glScissor()
    则只需定义剪切矩形(即绘制位置)。这可能就是你需要的一切。 使用
    glViewport()
    可以在幕后调用
    glScissor()
    ,并更改坐标映射到屏幕空间的方式

    如果要将绘图限制为其中一个面板(不使用局部坐标),请使用
    glScissor()
    。否则,请使用
    glViewport()

    至于面板,我可能会使用一些抽象基类:

    class Panel {
        // ...
        virtual void OnDraw(void) = 0;
    
        void Draw(void) {
            glViewport(x, y, w, h);
            OnDraw();
            glViewport(0, 0, parent_w, parent_h);
        }
    }
    

    这些窗口是以像素为单位的固定大小,还是希望它们随窗口一起调整大小?如果它们调整大小,你是想重新定位它们内部的东西,还是想让它们简单地拉伸?@Thomas主窗口以固定大小开始,但它是可重新调整大小的。每个面板都像
    1/num_panels*100%
    高~90%宽。如果主窗口调整大小,面板应保持其各自的百分比大小。谢谢代码。我不太理解“如果您想将绘图限制在其中一个面板(不使用局部坐标)”部分。你说的局部坐标是什么意思?理想情况下,对于每一个面板,我希望能够为需要绘制的对象传递绝对坐标(因此,每个面板基本上被视为一个新窗口),这将是我所考虑的相对(或局部)坐标。如果希望面板的角为例如(0,0),则使用
    glViewport()
    。使用
    glScissor()
    坐标仍将保持不变(您只需剪裁正在绘制的像素)。是否可以使用标准化坐标定义我的面板位置?似乎
    glViewport
    需要绝对坐标。但是,如果我可以使用标准化坐标(0-1),那么面板将始终保持在原位,并随父窗口调整大小。可能吗?调整窗口大小时,您必须计算并更新要传递给
    glViewport()
    的屏幕坐标。不要认为这里有使用标准化坐标的方法(仅用于参数;实际图形将使用您设置的任何坐标)。或者,可以将面板渲染为纹理,然后使用四边形将该纹理绘制到面板位置。