剪裁测试(Scissor Test)用于限制绘制区域。
我们可以指定一个矩形的剪裁窗口,当启用剪裁测试后,只有在这个窗口之内的像素才能被绘制,其它像素则会被丢弃。
换句话说,无论怎么绘制,剪裁窗口以外的像素将不会被修改。
可以通过下面的代码来启用或禁用剪裁测试:
glEnable(GL_SCISSOR_TEST); // 启用剪裁测试
glDisable(GL_SCISSOR_TEST); // 禁用剪裁测试
可以通过下面的代码来指定一个位置在(x, y),宽度为width,高度为height的剪裁窗口。glScissor(x, y, width, height);
注意: glScissor窗口坐标是以左下角为(0, 0),右上角为(width, height)的,这与Windows系统窗口有所不同。
下面的代码将GLWidget绘图区域中进行四周边界处10像素的裁剪:
// 启用剪裁测试
glEnable(GL_SCISSOR_TEST);
// 裁剪区域
glScissor(10, 10, this->geometry().width()- 20,this->geometry().height()- 20);
运行效果:
Qt自带的boxes例程中,QtBox类可以显示一个旋转的漂亮立方体,但是在其旋转的过程中绘制区域会超出图形项Item的黄色边界,如下图所示:
此时可以设置裁剪区,黄色边界内的绘制显示,边界外的则不绘制!
在QtBox::paint中添加代码如下:
//全局绘制区域的大小
float width = float(painter->device()->width());
float height = float(painter->device()->height());
//全局绘制区域的大小
glScissor(pos().x() - m_size / 2, height - m_size / 2 - pos().y(), m_size, m_size);
glEnable(GL_SCISSOR_TEST);
……
glDisable(GL_SCISSOR_TEST);
其中,m_size为黄色正方形区域的大小,pos()获取在全局场景绘制区域中的图元中心坐标位置。
修改后运行效果: