带有OpenGL的嵌套剪刀盒

时间:2011-09-19 00:19:23

标签: c opengl

我正在研究用C编写的基于OpenGL的UI。我有一个控件层次结构 - 一个较大控件的可滚动区域内的小方框2D框。在小盒子内部绘制3D场景。必须在小型2D框内剪切3D场景,并且必须在较大区域内剪切小型2D框。

glScissor()显然可以确保绘图在所需区域内进行。问题是,我无法同时为大区域调用glScissor(),然后再次为较大的剪切区域内的子区域调用glScissor()

示例代码,用于演示我想要的内容:

void drawBigBox() {
    glScissor( ... ); //set the bounds of the larger region
    for each little box {
        //these might be anywhere, but they should only be visible if inside the glScissor bounds
        drawLittleBoxes(); 
    }
}

void drawLittleBoxes() {
    //draw only inside little box -- Whoops! This replaces the big box bounds!
    //How can I meet this constraint while retaining the outer scissor region?
    glScissor( ... );
    draw3dScene();
}

有没有一种简单的方法可以做我想要的事情?显然我也可以计算小型和大型剪刀盒的交叉点,或者我可以更仔细地剪辑/投影我的3D场景,但这比OpenGL调用更复杂。也许还有另一种做法,我不知道。

谢谢!

3 个答案:

答案 0 :(得分:6)

为此,使用模板缓冲区可能更容易。在向其写入四边形时,可以使用INCR增加模板缓冲区值,并在绘制时将测试设置为EQUAL或GEQUAL以仅写入模板缓冲区具有最高值的位置,因此它只会写入受限制的区域所有当前剪辑区域。要在绘制层次结构时删除它们,请使用DECR再次删除它们。 这样,您也可以使用非矩形剪裁区域。

答案 1 :(得分:4)

您可以尝试依赖glPush / PopAttribs调用来保存和恢复剪刀状态。但是,在3.1中删除了,属性的堆栈可能没有您需要的那么大。所以你应该使用一个显式堆栈。

只需制作一些用于设置当前剪刀状态的对象。沿着调用堆栈向下的每一层都会推动其剪刀状态,该剪切状态使用剪切矩形的实际堆栈。我有一个通用版本,它也推动变换矩阵,混合参数等等。

该对象必须是全局GUI状态,或者与传递给每个函数的某个对象捆绑在一起。

答案 2 :(得分:2)

您可以使用带有glGet()参数的GL_SCISSOR_BOX来获取当前剪刀框的坐标(要么保存它们,要么计算它们与其他区域的交点)。