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(シーンの最初)からのrectからピックマトリックスを取得し、それを単位行列で乗算してから、パースペクティブマトリックスを適用する必要があります。それ。

目標は、ピクセル領域だけをビューポートの中央に配置し、そこに実際に表示されているものをすべてレンダリングすることです。

gluPickMatrixにどのような値を入力しても、ビューポート内のオブジェクトは常に表示され、縮小、変形、または変形されますが、常にビューポート領域に表示されます。そして、これは間違っています。ポイント(0; 0)に幅1と高さ1を加えたものからピック行列を要求すると、空の領域が返されるはずだからです。

これはあなたが問題を理解するのを助けるために私が得る画像です

ここに画像の説明を入力してください

なぜこうなった?ピックマトリックスは何をすることになっていますか?オブジェクトをシーンの外に移動しますか?シェーダーでプログラム可能なパイプラインを使用しているので(基本的には、オブジェクトにテクスチャをロードしてフォンライティングを使用するための単純なシェーダーです)、オブジェクトの変形とシーン上での絶え間ない存在を引き起こす可能性があるのは何ですか?

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

もう 1 つの可能性は、選択にレイ プリミティブ テストを使用することです。

于 2012-07-19T16:34:23.733 に答える