我正在研究用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调用更复杂。也许还有另一种做法,我不知道。
谢谢!
答案 0 :(得分:6)
为此,使用模板缓冲区可能更容易。在向其写入四边形时,可以使用INCR增加模板缓冲区值,并在绘制时将测试设置为EQUAL或GEQUAL以仅写入模板缓冲区具有最高值的位置,因此它只会写入受限制的区域所有当前剪辑区域。要在绘制层次结构时删除它们,请使用DECR再次删除它们。 这样,您也可以使用非矩形剪裁区域。
答案 1 :(得分:4)
您可以尝试依赖glPush / PopAttribs调用来保存和恢复剪刀状态。但是,在3.1中删除了,属性的堆栈可能没有您需要的那么大。所以你应该使用一个显式堆栈。
只需制作一些用于设置当前剪刀状态的对象。沿着调用堆栈向下的每一层都会推动其剪刀状态,该剪切状态使用剪切矩形的实际堆栈。我有一个通用版本,它也推动变换矩阵,混合参数等等。
该对象必须是全局GUI状态,或者与传递给每个函数的某个对象捆绑在一起。
答案 2 :(得分:2)
您可以使用带有glGet()
参数的GL_SCISSOR_BOX
来获取当前剪刀框的坐标(要么保存它们,要么计算它们与其他区域的交点)。