我们用glViewport函数可以轻易的将屏幕分为几个部分并且再各个部分做相应的绘图处理,但是如何在一个窗口内添加另外一个小窗口,我们则需要用到剪裁函数glScissor。

1
2
3
4
5
6
7
8
9
10
函数名:glScissor — 定义裁剪窗口  

C语言描述:void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);

参数:x,y指定裁剪窗口的左下角,初始值为(0,0)。
width, height指定裁剪窗口的宽和高。当一个GL上下文第一次关联到窗口时,会使用width和height作为窗口的尺寸。

描述:在窗口坐标定义了一个称为裁剪窗口的矩形区域。前两个参数x、y指定了裁剪窗口的左下角。width和height指定了窗口的宽和高。
通过glEnable和glDisable函数并使用GL_SCISSOR_TEST参数来启用或者禁用裁剪测试。裁剪测试初始时是不可用的。当裁剪测试启用后,只有在裁剪窗口中的像素才是可以被绘制函数修改的。窗口坐标在帧缓冲区像素的共享角里使用整数值。glScissor(0,0,1,1)只允许修改窗口左下角的像素,glScissor(0,0,0,0)不允许修改窗口中的任何像素。
**如果裁剪测试没有启用,就可以当作裁剪窗口是整个窗口区域。**

代码示例:

1
2
3
4

void display()
{
//big painting board glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(25, width / (double)height, 0.1, 25000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(eye.x, eye.y, eye.z, center.x, center.y, center.z, upVector.x, upVector.y, upVector.z); glEnable(GL_DEPTH_TEST); /*****draw model*****/ //samll painting board glViewport(0, 0, 0.25 * width, 0.25 * height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glScissor(0, 0, 0.25 * width, 0.25 * height); glEnable(GL_SCISSOR_TEST); glClearColor(0.9f, 0.9f, 0.9f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluOrtho2D(0, 0.25 * width, 0, 0.25 * height); /*draw model*/ glDisable(GL_SCISSOR_TEST); glutSwapBuffers(); }

结果显示: