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

    修改后运行效果:

  • 相关阅读:
    C语言的特点与缺点
    C语言的特点与缺点
    HDU1234 开门人和关门人
    HDU1234 开门人和关门人
    B00014 C++实现的AC自动机
    B00014 C++实现的AC自动机
    HDU4716 A Computer Graphics Problem
    HDU4716 A Computer Graphics Problem
    I00029 C语言程序-打印九九乘法表
    I00029 C语言程序-打印九九乘法表
  • 原文地址:https://www.cnblogs.com/MakeView660/p/10457905.html
Copyright © 2011-2022 走看看