1

OpenTK で作業しているプロジェクトの照明の修正を長い間延期しました。基本的に問題は、カメラを回転させると、表示している地形に表示される照明も回転することです。

これが私の onRenderFrame コードのスニペットです。

protected override void OnRenderFrame(FrameEventArgs e)
    {
        base.OnRenderFrame(e);

        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

        float dist = (float)Math.Sin(Math.PI / 3) * camZoom;

        Matrix4 view = Matrix4.LookAt(new Vector3(-(float)Math.Cos(camRot) * dist, dist, -(float)Math.Sin(camRot) * dist) + camPos, camPos, new Vector3(0, 1, 0));
        //Note: camPos isn't actually the position of the camera, rather the target of it. The actual camera position is calculated above.


        GL.MatrixMode(MatrixMode.Modelview);

        GL.LoadMatrix(ref view);

        float tx = 50;
        float ty = 20;
        float tz = -15;

        GL.Light(LightName.Light0, LightParameter.Position, new float[] { tx, ty, tz});

        GL.Begin(BeginMode.Lines);
        DrawBox(tx - 2, tx + 2, ty - 2, ty + 2, tz - 2, tz + 2);
        GL.End();

・・・地形図はこちら

簡単な DrawBox 関数を使用して、ライトの位置の周りに単純なボックスを描画しました。それは正常に機能しています。地球の周りの太陽などの動きも実装しました。カメラは移動していませんが、これはうまく機能していました。しかし、カメラの向きを変えると、照明は本来あるべきものを表示しなくなり、実際には動かさずに、光を「動かした」ように見えました (描かれたボックスは動かされず、光の効果のみでした)。

4

1 に答える 1

1

GL_POSITION パラメータを使用した glLightのOpenGL 仕様によると、次のようになります。

GL_POSITION: params には、均一なオブジェクト座標でのライトの位置を指定する4 つの整数値または浮動小数点値が含まれます。整数値と浮動小数点値の両方が直接マップされます。整数値も浮動小数点値もクランプされません。

位置は、glLight が呼び出されると (ポイントであるかのように) modelview マトリックスによって変換され、目の座標に格納されます。位置の w コンポーネントが 0 の場合、ライトは指向性光源として扱われます。拡散照明と鏡面反射照明の計算では、光の方向は考慮されますが、実際の位置は考慮されず、減衰は無効になります。それ以外の場合、ディフューズおよびスペキュラー ライティングの計算は、目の座標におけるライトの実際の位置に基づいており、減衰が有効になっています。初期位置は (0, 0, 1, 0) です。したがって、最初の光源は方向性があり、平行で、-z 軸の方向にあります。

フロートを 3 つだけ渡します。OpenTK が 4 番目の (w) コンポーネントとして何を使用するかは定かではありませんが、指定されていないパラメーターを 0 にすることで、ライトの指向性を高め、指定した位置を無視すると思います。渡した配列の最後に 1.0 を追加してみて、問題が解決するかどうかを確認します。

于 2012-04-27T03:47:32.853 に答える