1

我有以下代码来绘制一个openGL场景

void QGLDiagramWidget::paintGL()
{

    glClearColor(0.2f, 0.0f, 0.5f, 0.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glEnable(GL_MULTISAMPLE);

    ... load shaders...

    ... load buffers...

    ... load textures...

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Set viewport area
    glViewport(0, 0, this->size().width(), this->size().height());

    GLint view[4];
    glGetIntegerv(GL_VIEWPORT, view);
    glLoadIdentity();

    gluPickMatrix(1, 1, 1, 1, view); // THIS IS THE RELEVANT CODE

    // I don't use a fixed pipeline, so let's store this pickmatrix in a variable
    Matrix pickingPerspMatrix;
    glGetFloatv(GL_PROJECTION_MATRIX, pickingPerspMatrix); // This is successful in my code

    // Create the projection matrix
    gl_projection.setToIdentity();
    gl_projection *= pickingPerspMatrix; // APPLY THE PICKING MATRIX
    gl_projection.perspective(45.,((GLfloat)this->size().width())/((GLfloat)this->size().height()),0.1f,100.0f);



    ... now draw the entire scene with shaders, there's a camera matrix (view) and a model matrix (model) ...
}

据我所知,这应该从宽度为 1 和高度为 1 的左下像素 1,1(场景的第一个)的矩形中获取一个选取矩阵,并将其乘以单位矩阵,然后应用透视矩阵它。

目标是:将我的像素区域集中在视口上并渲染那里真正可见的任何内容。

事实证明,无论我在 gluPickMatrix 中输入什么值,我的视口中的对象总是可见的,只是缩小、扭曲或变形,但总是在视口区域内。这是错误的,因为从点 (0;0) 加上宽度 1 和高度 1 请求选取矩阵应该返回一个空白区域。

这是我为帮助您理解问题而获得的图像

在此处输入图像描述

为什么会这样?选择矩阵应该做什么?将物体移出场景?由于我在着色器中使用了可编程管道(它们基本上是简单的着色器,用于在对象上加载纹理并使用 phong 照明),什么会导致对象变形及其在场景中的持续存在?

4

1 回答 1

1

pickmatrix 用于将渲染限制在视口的一小部分。在此处阅读 gluPickMatrix:http ://www.opengl.org/sdk/docs/man/xhtml/gluPickMatrix.xml

拾取不适用于您的可编程管道。拾取通过将每个绘制调用与“名称”(代表可拾取对象的数字)相关联来工作,并且在使用拾取渲染场景时,它返回任何像素/片段。

此处解释了详细信息: http ://content.gpwiki.org/index.php/OpenGL:Tutorials: Picking 和此处 web.engr.oregonstate.edu/.../Picking/picking.pdf

您最好避免使用过时的功能并使用颜色选择,用唯一的纯色渲染每个对象,然后使用 glReadPixels 找出鼠标下的内容。

在这里很好地解释了颜色选择:http ://content.gpwiki.org/index.php/OpenGL_Selection_Using_Unique_Color_IDs

另一种可能性是使用射线原始测试进行选择。

于 2012-07-19T16:34:23.733 回答