6

私は OpenGL を何年も使用してきましたが、初めて D3D を使用しようとした後、シーン ライトをオブジェクトに固定するのではなく、ワールド内に固定したままにする方法を見つけるのにかなりの時間を費やしました。

OpenGL では、ライトの位置は MODELVIEW マトリックスを使用して他のすべてと同じように変換されるため、ライトを空間に固定するには、MODELVIEW をライトに必要な方法で設定し、glLightPosition を呼び出してからジオメトリ用に設定し、ジオメトリ呼び出しを行います。 . D3D では役に立ちません。

(コメント -- 私は最終的にこの回答を見つけましたが、Web や MSDN で役立つ情報を見つけることができませんでした。その時点でこの回答を見つけることができれば、数時間頭を悩ませる必要がなかったでしょう。 )

4

2 に答える 2

2

私が最終的に発見した答えは、OpenGL には融合MODELVIEWマトリックスが 1 つしかないのに対し、D3D では「ワールド」と「ビュー」の変換が分離されており、ライトの配置が主な理由のようだということでした。したがって、答えはD3DTS_VIEW、ライトに適用するD3DTS_WORLDマトリックスを設定し、ワールド内のジオメトリの配置に適用するマトリックスを設定するために使用することです。

実際、D3D システムは OpenGL の方法よりも理にかなっています。これにより、現在の「ビュー」変換によって変換されるように常に位置を変更することなく、いつでもどこでも好きなときにライトの位置を指定できます。OpenGLは、「ビュー」と「モデル」が何であるかを単純に認識できないため、そのように機能する必要があります。それはすべてGLのモデルビューです。

(コメント - ここで私自身の質問に答えることが想定されていない場合は申し訳ありませんが、これは私が数週間前に持っていた本当の質問であり、他の人が OpenGL から D3D に移行するのを助けるためにここに投稿する価値があると考えました。基本的な概要D3D ライティングとレンダリング パイプラインのほとんどを手に入れるのは難しいようです)。

于 2008-09-16T12:44:27.377 に答える
0

固定関数パイプラインの場合、ライトの位置と方向はワールド空間で設定されます。軽量構造のドキュメントにはそれが記載されていますが、ドキュメントでそれを見逃していても驚かないでください。プログラム可能なシェーダーに重点が置かれているため、固定機能パイプラインに関する情報はあまりありません。

于 2008-09-16T12:53:55.247 に答える