zoukankan      html  css  js  c++  java
  • Qt OpenGL裁剪测试

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

    修改后运行效果:

  • 相关阅读:
    蓝牙Profile的概念和常见种类
    蓝牙及蓝牙耳机工作原理
    蓝牙的术语表
    安卓开发-Activity中finish() onDestroy() 和System.exit()的区别
    解决Android Activity切换时出现白屏问题
    安卓手机连接蓝牙打印机实现打印功能
    如何实现android蓝牙开发 自动配对连接,并不弹出提示框
    排列汇总
    abstract修改方法
    Solr入门指南
  • 原文地址:https://www.cnblogs.com/MakeView660/p/10457905.html
Copyright © 2011-2022 走看看