0

QGLWidget で立方体をレンダリングしようとしましたが、うまくいきません。どう回転させても平べったい四角に見えます。頂点の Z 座標に気付かなかったようです。GL_DEPTH_BUFFER_BIT のクリアを追加する直前に、正方形は立方体のすべての側面が 1 つに詰め込まれたように見えました。今では前面に属さない頂点を破棄しているように見えますが、それでも立方体ではありません!

スクリーンショット [リンク]

私の initializeGL() と paintGL():

typedef struct
{
    float XYZW[4];
    float RGBA[4];
} Vertex;

Vertex Vertices[8] =
{
    //vertices
};

const GLubyte Indices[36] =
{
    //indices
};

void ModelView::initializeGL()
{
    m_program = new QGLShaderProgram(this);
    m_program->addShaderFromSourceCode(QGLShader::Vertex, vertexShaderSource);

    m_program->addShaderFromSourceCode(QGLShader::Fragment, fragmentShaderSource);

    m_program->link();
}

void ModelView::paintGL()
{
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glClearColor(.5f, .5f, .5f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glViewport(0, 0, width(), height());

    m_program->bind();

    QMatrix4x4 matrix;
    matrix.perspective(60, 4.0/3.0, 0.1, 100.0);
    matrix.translate(0, 0, -2);
    matrix.rotate(50.0, 1, 1, 1);

    m_program->setUniformValue(m_matrixUniform, matrix);

    m_posAttr = m_program->attributeLocation("posAttr");
    m_colAttr = m_program->attributeLocation("colAttr");
    m_matrixUniform = m_program->uniformLocation("matrix");

    glGenBuffers(1, &BufferId);
    glGenBuffers(1, &IndexBufferId);

    glBindBuffer(GL_ARRAY_BUFFER, BufferId);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBufferId);

    glBufferData(GL_ARRAY_BUFFER, BufferSize, Vertices, GL_STATIC_DRAW);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);

    glVertexAttribPointer(m_posAttr, 2, GL_FLOAT, GL_FALSE, VertexSize, 0);
    glVertexAttribPointer(m_colAttr, 3, GL_FLOAT, GL_FALSE, VertexSize, (GLvoid *)RgbOffset);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, NULL);

    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(0);

    m_program->release();
}

頂点とインデックスは正しく定義する必要があります。これらは、ほとんどのコードと同様にチュートリアルから取得したものです。ただし、2D オブジェクトのレンダリングは問題ないようです。

また、チュートリアルが -2 引数で matrix.translate を呼び出すのはなぜですか? 1 より大きい値に変更するか削除すると、レンダリングされたオブジェクトが消えます。

Qt5、Windows Vista 32 ビット。

4

2 に答える 2

2

また、チュートリアルが-2引数を指定してmatrix.translateを呼び出すのはなぜですか?1より大きい値に変更するか削除すると、レンダリングされたオブジェクトが消えます。

これはクリッピングによるものです。オブジェクトをレンダリングすると、「近すぎる」または「遠すぎる」ものは、​​(それぞれ)近距離および遠距離のクリッピング平面を介して破棄されます。

立方体を近づける(-2を1または0に変更する)ことにより、立方体を前方に移動し、近くのクリッピング平面を通過します。その結果、立方体は消えます。

于 2013-03-08T10:19:19.763 に答える
2

glVertexAttribPointer()には、size頂点ごとのコンポーネントの数を指定するパラメーターがあります。コードでは 2 であるため、すべてが 2D です。3 に変更すると問題が解決します。

于 2013-03-08T14:57:12.630 に答える