我有以下代码来绘制一个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 照明),什么会导致对象变形及其在场景中的持续存在?