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(シーンの最初)からのrectからピックマトリックスを取得し、それを単位行列で乗算してから、パースペクティブマトリックスを適用する必要があります。それ。
目標は、ピクセル領域だけをビューポートの中央に配置し、そこに実際に表示されているものをすべてレンダリングすることです。
gluPickMatrixにどのような値を入力しても、ビューポート内のオブジェクトは常に表示され、縮小、変形、または変形されますが、常にビューポート領域に表示されます。そして、これは間違っています。ポイント(0; 0)に幅1と高さ1を加えたものからピック行列を要求すると、空の領域が返されるはずだからです。
これはあなたが問題を理解するのを助けるために私が得る画像です
なぜこうなった?ピックマトリックスは何をすることになっていますか?オブジェクトをシーンの外に移動しますか?シェーダーでプログラム可能なパイプラインを使用しているので(基本的には、オブジェクトにテクスチャをロードしてフォンライティングを使用するための単純なシェーダーです)、オブジェクトの変形とシーン上での絶え間ない存在を引き起こす可能性があるのは何ですか?