0

私は一日中オブジェクトを適切に照らそうとしていて、結果が出ないようにしようとしていたので、ここで試してみます。本質的に、私はオブジェクトを次のように見せようとしています。

GLCプレーヤー(3Dモデルビューア)の3Dモデルの一部

私のプログラムでは、次のようになります。

レンダラーによって描画された3Dモデルの一部

これが私のコンテキストです:

glClearDepth(1.0);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLight(GL_LIGHT0, GL_POSITION, {0, 5, 0, 1});
glDisable(GL_TEXTURE_2D);

そして私の材料/照明設定:

glMaterialf(GL_FRONT, GL_SHININESS, 10);

glLight(GL_LIGHT0, GL_AMBIENT, {0.1, 0.1, 0.1, 1.0});
glLight(GL_LIGHT0, GL_DIFFUSE, {0.2, 0.2, 0.2, 1.0});
glLight(GL_LIGHT0, GL_SPECULAR, {0.6, 0.6, 0.6, 1.0});

glMaterial(GL_FRONT, GL_AMBIENT, {1, 0.8078, 0});
glMaterial(GL_FRONT, GL_DIFFUSE, {1, 0.8078, 0});
glMaterial(GL_FRONT, GL_SPECULAR, {0.5, 0.5, 0.5});
glMaterial(GL_FRONT, GL_EMISSION, {0, 0, 0});

[簡単にするために、配列を示すために{r、g、b、a}を使用しました。モデルの描画に使用された実際の値を調べて、配列に書き込みました]

主な問題は、オブジェクトが完全に照らされるたびに、すべてが周囲の色に「乱雑」になることです。フラグメントの方向に応じて、明るい部分と暗い部分はなくなり、単色の1つのチャンクだけになります。

プロジェクト全体で、見逃した可能性のあるopenGL設定を検索しましたが、上記で表示されているものだけが見つかりました(投影とモデルビューのマトリックスをリセットするためのいくつかの呼び出しを省略し、画面をクリアし、変換/回転します)。

また、ライトとマテリアルの値を変更しようとしましたが、あまり成功しませんでした。アンビエントカラーを変更すると、モデル全体が明るくなります。ライトも動かしてみました。

編集:リクエストに応じて、モデルを保存して描画する方法は次のとおりです。

OBJファイルからモデルをロードします。法線がリストされているファイル自体を調べました。ローダーもそれを認識します。

VBOの描画方法は次のとおりです。

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertexBufferID);
glVertexPointer(3, GL_FLOAT, stride, 0 * 4);
glNormalPointer(GL_FLOAT, stride, 3 * 4);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, indexBufferID);
glDrawElements(GL_TRIANGLES, this.numberOfVertices, GL_UNSIGNED_INT, 0);

VBOはインターリーブされ、[vertex、normal、vertex、normal、..]のようにフォーマットされます。描画コードにいくつかの印刷呼び出しを削除しました。これにより、頂点と通常のポインターが設定されます。したがって、VBO自体が正しくロードおよび描画されていることを確信しています。

4

2 に答える 2

2

texture_coord_array クライアント状態を有効のままにしておくとクラッシュします。そのため、null である texcoord ポインターにあるものにアクセスしようとします。

于 2012-08-24T20:01:47.100 に答える
1

そのため、多くの問題では、答えが予期しないことがよくあります。最初の部分は、VBO のデータ ポインターを設定する方法を決定するために使用した switch ステートメントでした。

private void setDataPointers() {
    int stride = this.dataFormat.elementsPerVertex * 4;
    glVertexPointer(3, GL_FLOAT, stride, 0 * 4);
    switch(this.dataFormat)
    {
        case VERTICES_AND_TEXTURES:
            glTexCoordPointer(2, GL_FLOAT, stride, (3)*4);
        case VERTICES_AND_NORMALS:
            glNormalPointer(GL_FLOAT, stride, 3 * 4);
        case VERTICES_TEXTURES_NORMALS:
            glTexCoordPointer(2, GL_FLOAT, stride, 3 * 4);
            glNormalPointer(GL_FLOAT, stride, (3 + 3) * 4); 
    }
}

ご覧のとおり、休憩。ステートメントが欠落しています。したがって、頂点、法線、およびテクスチャ ポインターが設定されます。

2 つ目は、VBO を描画するときに、3 つのクライアント側モードがすべて有効になっていることです。

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

そのため、レンダラーは存在しないテクスチャ座標を探していて、どういうわけか奇妙な照明のないジオメトリを吐き出しました。

于 2012-08-24T20:10:42.380 に答える