注意与Clipping区分开来。
只刷新屏幕上变化的部分,可以提高渲染性能。我们可以限制OpenGL渲染在窗口上一个指定的矩形区域(裁剪框)中。默认情况下,裁剪框和窗口大小一样,且不会进行剪裁测试。

  1. glEnable( GL_SCISSOR_TEST ); // 开启剪裁测试,默认不开启。
  2. // 指定裁剪区域。
  3. void glScissor( GLint x, // x、y指定裁剪区域的左下角。
  4. GLint y,
  5. GLsizei width, // widht、height指定裁剪区域宽高。
  6. GLsizei height );
  7. // ******************* 例子:
  8. while(......) // 渲染循环
  9. {
  10. // 整个屏幕绘制层蓝色
  11. glClearColor( 0.0f, 0.0f, 1.0f, 0.0f ); // 指定clear color buffer之后的颜色,默认黑色
  12. glClear( GL_COLOR_BUFFER_BIT ); // 清楚颜色缓冲区附件
  13. // rect(100, 100, 600, 400)的矩形区域绘制成红色
  14. glClearColor( 1.0f, 0.0f, 0.0f, 0.0f ); // 先设置好参数,在glEnable开启,正确的写法。
  15. glScissor( 100, 100, 600, 400 );
  16. glEnable( GL_SCISSOR_TEST );
  17. glClear( GL_COLOR_BUFFER_BIT );
  18. // rect(200, 200, 300, 200)的矩形区域绘制成绿色
  19. glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
  20. glScissor( 200, 200, 300, 200 );
  21. glClear( GL_COLOR_BUFFER_BIT );
  22. // 最后一步首尾工作别忘了,回复至初始状态
  23. glDisable( GL_SCISSOR_TEST );
  24. }

image.png

glScissor

  1. void glScissor( GLint x,
  2. GLint y,
  3. GLsizei width,
  4. GLsizei height);
  5. // 定义scissor box。
  6. // x, y: scissor box的左下角,默认(0,0)
  7. // width, height: scissor box的宽高,初始是窗口宽高。
  8. glEnable(GL_SCISSOR_TEST) // 开启剪裁测试
  9. glDisable(GL_SCISSOR_TEST) // 关闭剪裁测试

当开启剪裁测试时,在scissor box内的像素将会被绘制命令修改。
当关闭裁剪测试时,scissor box includes 整个window。
GL_INVALID_VALUE is generated if either width or height is negative。