OpenGLの照明は締め付けられているようです

私の光の前に置かれたものがすべて私のシーンで黒く見えるという奇妙な問題を経験しています。これは複数の軸で発生します。私は解決策を見つけるためにインターネットの深さを調べましたが、私は何も見つけることができません。これは私のモデルだけに起こっていることに注意することも重要です。モデルの法線は罰金でダンディです。シーンの残りの部分は予想通りにレンダリングされます。

Here's how it looks: Flower

これが私の光がどのように初期化されるかです:

GLfloat light_ambient[] =
{ 0.2, 0.2, 0.2, 1.0 };
GLfloat light_diffuse[] =
{ 0.8, 0.8, 0.8, 1.0 };
GLfloat light_specular[] =
{ 1.0, 1.0, 1.0, 1.0 };
GLfloat light_position[] =
{ 15.0, 11.0, 10.0, 1.0 };

glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.4);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.1);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.0);

glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);

これが私の光の位置の設定方法です:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, (double)g_window1Width/g_window1Height, 1.0, 300.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslated(0.0, 0.0, -player.camera.Dist);
glRotated(player.camera.Angle-90, 1.0, 0.0, 0.0);
glRotated(player.camera.Rot, 0.0, 0.0, 1.0);
glTranslated(-player.camera.TgtX, player.camera.TgtY, -player.camera.TgtZ);
glScaled(1.0, -1.0, 1.0);
glEnable(GL_POLYGON_OFFSET_LINE);
glPolygonOffset(g_offset[0], g_offset[1]);

glClearColor(0.0, 0.0, 0.0, 0.0);
glClearStencil(0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

glm::vec4 light_position;
light_position.x = player.mouseMapPos.x - 1;
light_position.y = player.mouseMapPos.y - 1;
light_position.z = player.mouseMapPos.z + 0.5;
light_position.w = 1.0f;

glLightfv(GL_LIGHT0, GL_POSITION, glm::value_ptr(light_position));

必要に応じてより多くのコードと情報を提供できます。

5
ru de
あなたの画像が見えません。たぶん私たちのプロキシが原因で、それはhttpsを通過させません。クランプの問題がある場合は、HDRパイプラインに移動するか、照明範囲を管理してください。
追加された 著者 v.oddou,
減衰定数を0に変更しても同じ結果になります。光はモデル上に一種の硬い線を作成します。ライトがオブジェクトの背後にあるかどうかによっては、まったく点灯しないことがあります。
追加された 著者 guge,
減衰を減らしてみてください。一定の減衰を0にする。
追加された 著者 Voitcus,

4 答え

あなたの主な問題はあなたがあなたの法線を修正する必要があるということです。なめらかな法線を正しく計算したい場合は、私の答えをチェックしてください。 ://gamedev.stackexchange.com/questions/68769/how-can-i-calculate-a-terrains-normals/68770#68770 ">こちら。 法線が正規化されていることも確認してください。

あなたの2番目の問題はあなたの減衰値です、私はしばしば1つの減衰タイプでより良い結果を得ます。したがって、1種類の減衰を使用し、満足のいく結果が得られるまでその値を変更するようにしてください。

4
追加された
@Sparky私は理解しています、あなたの光の位置がinit時に設定されるもう一つの点、このように世界空間で固定されていますグローバルな状態が広範囲に使用されているため、古いopenGLを使用しているため、正確に推測することは困難です。
追加された 著者 user128932,
あなたが言ったように私は試しました。以前は滑らかな法線がAssimpによって生成されていました。これは、私が使用しているモデルロードライブラリです。私はあなたが提供したリンクからモデルの法線を手動で生成する方法を作りました。あなたが提案したように私も減衰値をデフォルトにリセットします。 - わずかに異なる照明でも同じ結果が得られます。 Blenderによって事前に生成された法線でもまったく同じ結果が得られるので、私の法線に何か問題があるかどうかは疑いようがありません。
追加された 著者 guge,

カメラに面していない法線は、設定では黒くなっています。

ライトアップしたい部分を照らすシーンにさらにライトを追加するか、明るさを最小の明るさで設定します。

2
追加された
グローバルアンビエント値を調整しましたが、それでも同じように動作します。
追加された 著者 guge,

これはコメントであるべきですが、私はそれらを作ることができません:(

とにかく、それはあなたのモデルの法線問題のように見えます。あなたが最初の写真の一番下の花を見るならば、照明は間違っています、そしてそれは前ではなく花の後ろと上から来ているように見えます。法線が正しいかどうかを確認するために、各ピクセルの色をnormalの値に設定してみてください。残念ながら、固定パイプラインでこれを行う方法がわかりません。

1
追加された
固定パイプラインを使用してこれを実行する方法があるかどうかわかりません。この場合の光は花の真上にあります。私がクランピングとは、シーン内のy軸上に光が配置されている場所を超える部分はすべて黒く表示されているため、硬い線であるということです。
追加された 著者 guge,

よくわかりませんが、光の色を設定するコードを移動してフレームを更新する必要があります。私はあなたがプログラムの開始時に一度だけ明るい色を初期化することを理解しているように、それはこの質問に従って各フレームを更新する必要があります

1
追加された