3

テクスチャのない三角形のメッシュがありますが、色 (青のようなもの) とアルファ (0.7f) が設定されています。このメッシュは実行時に生成され、法線は正しいです。照明をオンにすると、オブジェクトがレベル内を移動するにつれてオブジェクトの色が変化することがわかりました。また、照明が正しく見えません。このオブジェクトを描画するときのコードは次のとおりです。

glEnable( GL_COLOR_MATERIAL );
float matColor[] = { cur->GetRed(), cur->GetGreen(), cur->GetBlue(), cur->GetAlpha() };
float white[] = { 0.3f, 0.3f, 0.3f, 1.0f };
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matColor);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, white);

私が気付いたもう1つの奇妙なことは、無効にしてまたはのみを使用すると、照明が失敗することGL_FRONT_AND_BACKです。これが私の照明設定です(レンダラーの開始時に一度行われます):GL_FRONTGL_BACK

m_lightAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
m_lightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
m_lightPosition[] = { 0.0f, 1200.0f, 0.0f, 1.0f };

glLightfv(GL_LIGHT0, GL_AMBIENT, m_lightAmbient);
glLightfv(GL_LIGHT0, GL_SPECULAR, m_lightSpecular);
glLightfv(GL_LIGHT0, GL_POSITION, m_lightPosition);

編集:法線を「より」正確にするために多くのことを行いました(自分でサーフェスを生成しているため)が、オブジェクトの色は場所によって異なります。どうしてこれなの?openGL には、私が知らない特別な環境ブレンディングがありますか?

編集: 色の変化は、前のテクスチャがテクスチャ スタックにあり、描画されていなくてもglMaterialfvブレンドされていたためであることがわかりました。

4

8 に答える 8

1

@stusmithへの応答:

Z検定は、透明な三角形では役に立ちません。三角形ごとのアルファソートも必要になります。Z検定では透明度が考慮されていないため、いつでもカメラに面する三角形が重なる可能性のあるオブジェクト(凹型オブジェクト)がある場合は、ブレンドが正しく実行されるように、最初に最も遠い三角形を描画する必要があります。これらの2つの重なり合う(そして透明な)三角形を検討し、Z検定の有無にかかわらず、その少し重なり合った領域が描画されたときに何が起こるかを考えてください。おそらく、描画順序が実際に重要であるという結論に達するでしょう。透明性は吸う:P

    /\    /\
   /  \  /  \
  /    \/    \
 /     /\     \
/_____/__\_____\

これがあなたの問題であるとは確信していませんが、部分的に透明なオブジェクトを処理する場合、アルファソートを考慮する必要があります。

于 2008-11-10T09:31:00.880 に答える
1

GL_FRONT_AND_BACK が無効になっているときにライティングが失敗する場合は、法線が反転している可能性があります。

于 2008-11-07T14:14:06.270 に答える
1

OpenGL を初期化するコードを投稿できますか? 他のすべてのメッシュが完全に描画されているということですか? それらを同時にレンダリングしていますか?

于 2008-11-07T17:12:04.273 に答える
0

@sebastion:複数の描画呼び出し。各オブジェクトはglDrawArraysを取得します。いくつかはテクスチャーがあり、いくつかは色付きで、すべて法線があります。gl initコードは次のとおりです。glMatrixMode(GL_MODELVIEW);

// Vertices!
glEnableClientState(GL_VERTEX_ARRAY);

// Depth func
glEnable(GL_DEPTH_TEST);
glDepthFunc( GL_LESS );

// Enable alpha blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

// Lighting
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, m_lightAmbient);
glLightfv(GL_LIGHT0, GL_SPECULAR, m_lightSpecular);
glLightfv(GL_LIGHT0, GL_POSITION, m_lightPosition);

// Culling
glDisable( GL_CULL_FACE );
// Smooth Shading
glShadeModel(GL_SMOOTH);

m_glSetupDone = true;

この後、私はいくつかのカメラをセットアップしましたが、それは完全に標準、投影モード、錐台、モデルビュー、見て、翻訳です。

于 2008-11-10T08:54:14.840 に答える
0

三角形がアルファ ブレンドされている場合、顔をカメラからの Z オーダーで並べ替える必要はありませんか? そうしないと、前面の面の上にオブジェクトの背面の面をレンダリングすることになります。

于 2008-11-07T14:39:14.987 に答える
0

法線が正規化されていますか? そうでなく、glNormal 呼び出しで法線を指定している場合は、OpenGL に正規化を行わせることができます。これは避けるべきであることに注意してください。ただし、テストすることはできます。

glEnable(GL_NORMALIZE);

このようにして、glNormal を介して提供されるすべての法線ベクトルを再スケーリングするように OpenGL に指示します。

于 2009-01-05T14:08:15.673 に答える