首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相同参数的OpenGL重绘不同呈现结果

相同参数的OpenGL重绘不同呈现结果
EN

Stack Overflow用户
提问于 2015-07-13 10:51:13
回答 2查看 170关注 0票数 1

我有一个奇怪的问题,我想这是由qt引起的。我使用的是qt OpenGL小部件和重绘例程,MouseMove事件如下所示:

代码语言:javascript
复制
void RenderGraphFrame::redraw()
{
    GLdouble objX, objY, objZ;
    GLdouble ModelViewMatrixvector[16], ProjectionViewMatrixVector[16];
    GLint ViewportVector[4];

    glGetIntegerv (GL_VIEWPORT, ViewportVector);
    glGetDoublev (GL_MODELVIEW_MATRIX, ModelViewMatrixvector);
    glGetDoublev (GL_PROJECTION_MATRIX, ProjectionViewMatrixVector);

    gluUnProject(mousepositionX, mousepositionY, 0,
                 ModelViewMatrixvector,
                 ProjectionViewMatrixVector,
                 ViewportVector,
                 &objX,  &objY, &objZ);

    qDebug() << "objX: " << objX << " objY: " << objY << " objZ: " << objZ;

    qglColor(Qt::red);
    glBegin(GL_TRIANGLES);
        glNormal3f(0,-1,0.707);
        glVertex3f(objX-1,objY-1,0);
        glVertex3f(objX+1,objY-1,0);
        glVertex3f(objX,objY,1.2);
    glEnd();
}

void RenderGraphFrame::mouseMoveEvent (QMouseEvent *event)
{
    mousepositionX = event->x();
    mousepositionY = event->y();
    redraw();
    return;
}

当我将鼠标移到小部件上时,我通过qDebug()获得了整个输出流,因此肯定执行了偶数触发器和redraw()

为了进行测试,我想要呈现一个由4个三角形组成的正方形,其中一个在光标后面。

但只有3种形状的第4种形状不见了.至少我是这么想的。当我在执行任务时,当我是alt+tabbing的时候,我发现当我按下alt-key时,redraw()方法会再次被调用,与上次鼠标移动的输出完全相同,但是现在第四个形状被呈现出来了(不是在我想要的位置上,但这很可能只是我的3D逻辑中的错误)。

这怎么可能呢?在导致这种情况的小部件中有什么神秘的东西吗?如果这不是我的错,我能做什么,qt让我做它想做的吗?

编辑:

-I注意到,只要按下alt-key以导致所需的呈现,就很难再现(在单击alt+tab菜单上的“不同”时,在其他应用程序中进行选项卡操作是很困难的)。但是,可复制的是:当我退出应用程序,然后再次插入时,重绘将按其应有的方式工作。但不是从mousemove事件中调用的。

-I删除了不存在问题的静态形状,因此代码更易于阅读。

EN

回答 2

Stack Overflow用户

发布于 2015-07-13 11:21:33

错误是假设OpenGL上下文在每个函数调用时处于相同的状态。然而,Qt在呈现自己的内容时修改了许多状态。这就是为什么每次在代码中执行完全相同的GL调用时,也会得到不同的结果。

引用Qt文档:

..。油漆引擎将更改当前OpenGL上下文的状态,以反映其需求。应用程序不应依赖于将OpenGL状态重置为其原始条件,特别是当前的着色器程序、OpenGL视图、纹理单元和绘图模式。

因此,在每次调用redraw()时,许多状态,如边界纹理、多边形模式、混合、深度测试等,基本上都处于随机状态。您必须在redraw()开始时重置它们,以确保每次都得到相同的结果。

票数 2
EN

Stack Overflow用户

发布于 2015-07-13 12:17:58

我通过在事件侦听器中更改redraw()updateGL()的方法调用来修正这种行为。正如Lukas在他的回答中所描述的那样,这很可能与qt自己的行为有关。

现在正在运行的版本有这个方法的实现:

代码语言:javascript
复制
void RenderGraphFrame::mouseMoveEvent (QMouseEvent *event)
{
    mousepositionX = event->x();
    mousepositionY = event->y();
    updateGL();
    return;
}

注意:updateGL()是一个外部函数!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31381405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档