剪裁测试(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);

// 裁剪区域

,, ,);

运行效果:

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()获取在全局场景绘制区域中的图元中心坐标位置。

修改后运行效果:

Qt OpenGL裁剪测试的更多相关文章

  1. OpenGL光照测试

    OpenGL光照测试 花了大概半个月,研究了OpenGL的光照.请注意是固定管线渲染的光照,如果使用着色器的高手们请飘过.这个程序是通过光照对模型的照射,来研究OpenGL光照的性质.以后可以通过这个 ...

  2. ubuntu下配置qt+opengl+opencv

    原地址:http://www.cnblogs.com/aleny-liu/archive/2011/12/16/aleny-Qtnote1.html http://blog.csdn.net/jdh9 ...

  3. Qt OpenGL:学习现代3D图形编程之四,透视投影浅析

    一.非真实的世界 与之前几篇文章不同的是,这里要画12个三角形,这个12个三角形构造一个方形棱柱(这里为长方体).棱柱的每个四边形表面由两个三角形组成.这两个三角形其中的一条边重合,而且它们的六个顶点 ...

  4. Qt OpenGL三维绘图

     简介 OpenGL是为三维绘图提供的标准应用编程接口. OpenGL处理的仅仅是三维绘图方面,而很少或是根本不提供图形用户界面编程方面的支持.OpenGL*应用程序的用户界面必须由其它工具包创建,比 ...

  5. Qt 内存泄漏测试

    在说Qt的内存测试之前,首先需要说明和肯定的一点是:Qt是绝对没有内存泄漏的,我们必须相信这一点. 接下来,说明一下基于Linux的Qt内存测试工具及其用法和说明: 一.内存测试工具Valgrind ...

  6. QT OpenGL中文教程在QT4版本后的错误代码更改(一)

    由于教程中说的已经够可以了,这里就不对代码进行分析了,有兴趣可以自己去看看.这个教程来源于原来的NeHeOpenGL中文教程 (http://www.yakergong.net/nehe/) ,但其有 ...

  7. Qt OpenGL 鼠标拾取实现

    在之前的文章中讲到了OpenGL鼠标拾取操作的例子,工作中需要在Qt中实现,下面的程序演示了QT中opengl的拾取例子. 本例子在Qt5.12和Qt Creator4.8.0上测试,使用的是QOpe ...

  8. QT OpenGL绘制三维图形(立方体、圆柱体、圆锥、球体、圆环等等)

    本文使用QGLWidget来绘制各种三维基本图形,包括立方体.圆柱体.圆锥.球体.圆环等等,涉及包括基本绘制以及上色.纹理.旋转等操作. 使用的软件版本:QT5.12 + QT Creater4.8. ...

  9. OpenGL.Tutorial03_Matrices_测试

    1. 2. // ZC: 工程-->右键-->属性--> 配置属性: // ZC: C/C++ -->常规-->附加包含目录,里面添加: // ZC: E:\OpenGL ...

随机推荐

  1. [mqtt]mqtt嵌入式移植

    github eclipse paho source code: https://github.com/mqtt/mqtt.github.io/wiki/libraries STM32 mqtt移植: ...

  2. (DNS)dnsmasq部署DNS

    转自:https://www.hi-linux.com/posts/30947.html Dnsmasq提供DNS缓存和DHCP服务.Tftp服务功能.作为域名解析服务器(DNS),Dnsmasq可以 ...

  3. [uart]linux串口的阻塞非阻塞切换

    比如写的时候设置为阻塞,读的时候设置为非阻塞,就需要下面的切换方式 1.获取文件的flags,即open函数的第二个参数: flags = fcntl(fd,F_GETFL,0); 2.设置文件的fl ...

  4. JDK观察者模式和事件机制比较<转>

    原文:(六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型) 作者:zuoxiaolong8810(左潇龙),转载请注明出处. 本章我们讨论一个除前面的单例以及代理模式之外,一个WEB项目 ...

  5. win10老提示系统错误,要注销

    win10老提示系统错误,要注销? 开启user manager 服务(对我没用) 用administrator账户(成功,不提示了) 或者创建一个新账户(未测)

  6. docker启动报错

    1.报“can’t create unix socket /var/run/docker.sock: is a directory” 这是由于存在容器自动启动 --restart= always导致的 ...

  7. freemarker自己定义标签报错(二)

    freemarker自己定义标签 1.错误描写叙述 freemarker.core.ParseException: Unexpected end of file reached. at freemar ...

  8. jquery+easyui开发、培训文档

    目  录 1.... Accordion(可折叠标签)......................................................................... ...

  9. 情商UP:不遵守八小时工作制,你就能富起来??

    从工作第一天起,我们就默认了八小时工作制,但从没有想过,这是不是最高效的工作时间. 事实上,八小时工作制并没有科学依据,不过是多年来约定俗成的习惯罢了. 那些坚守八小时工作制的人和敢于打破它的人,都获 ...

  10. 解救小哈——DFS算法举例

    一.问题引入 有一天,小哈一个人去玩迷宫.但是方向感不好的小哈很快就迷路了.小哼得知后便去解救无助的小哈.此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈.那么,问题来了... 二. ...