2013-07-06 11 views
6

私はOpenGLグラフィックを学んでいて、影になっています。私が読んでいるチュートリアルでは、法線と光ベクトルをカメラ空間に変換するよう指示しています。どうしてこれなの?なぜあなたは模型の空間にコインを保つことができないのですか?モデル空間の代わりにカメラ空間を法線に使用するのはなぜですか?

次の質問は、モデル変換を処理する方法です。私は決定的な答えを見つけることができません。私は現在、次のコードを持っています:

vec3 normCamSpace = normalize(mat3(V) * normal);" 
vec3 dirToLight = (V*vec4(lightPos, 0.0)).xyz;" 
float cosTheta = clamp(dot(normCamSpace, dirToLight),0,1);" 

Vはビューマトリックスまたはカメラマトリックスです。モデルの位置、回転、スケールが変わったときに、光の移動や編集方法が不明です。

答えて

7

主な理由は、通常、ライトの位置はモデル空間ではなく、ワールド空間で与えられます。しかし、照明が効率的に機能するためには、すべての計算が共通の空間で行われなければならない。あなたの通常の変換チェーンでは、モデルのローカル座標を直接ビュー空間にモデルビュー行列によって変換され

p_view = MV · p_local 

あなたが正常に一つだけのモデルビュー行列を持っているので、

p_world = M · p_local 
p_view = V · p_world 
のようなものの中に、このSTEAPを分離するために面倒だろう

そのためにMVを分ける必要がありました。

投影変換は、伝統的に別個の工程として行われるため、ビュー・スペースが上のベースにどの照明計算の自然「共通の下部グランド」です。これは、あなたのライトポジションをワールドからビュースペースに変換する変換を含み、ライトポジションはあまり複雑ではないため、これはCPUと、シェーダとして与えられたあらかじめ変換されたライトポジションで行われます。

注:ワールド空間での照度計算やローカル空間のモデル化を妨げるものは何もありません。ライトポジションを正しく変換するだけです。

+0

よし。しかし、私はまだ、光源や位置をどのように変更して、回転や平行移動のようなものに対応できるかは不明です。 – user975989

+0

標準的な方法は、頂点の位置を変換するのと同じようにライトの位置を変換することです。スポットライト(スポット方向が必要なスポットライト)の場合は、法線を変換するのと同じようにスポット方向を変換します。空間間の各変換行列(これは、ワールドからモデルローカルへの変換にも当てはまります)では、ノーマル変換は常にポジション変換の逆転置です。 – datenwolf

0

私はOpenGLグラフィックスを学んでおり、影になっています。私が読んでいるチュートリアルでは、法線と光ベクトルをカメラ空間に変換するよう指示しています。どうしてこれなの?なぜあなたは模型の空間にコインを保つことができないのですか?

実際にシェーダーを書いている場合は、任意の座標スペースを使用できます。世界の空間における照明を計算するIMOは、より自然な感じですが、それは味の問題です。

はしかし、二つの小さな詳細があります

  1. あなたのオブジェクトは、肌のメッシュ(骨によってアニメーションキャラクターモデル)である場合は、「自然」、オブジェクト空間内の照明を計算することはできません。このようなモデルは、世界の空間または視空間を必要とする。オブジェクトを平行移動と回転のみが可能な場合(アフィン変換のみ)、照明はモデル/オブジェクト空間で簡単に計算できます。私はいくつかのゲームエンジンが実際にこのように働いたと思います。
  2. カメラ空間を使用する場合は、鏡面ハイライトを計算するときに1つの減算を削除できます。 Blinn/phong鏡面モデルは、鏡面反射因子を計算するために、眼にベクトル(または眼から)を必要とします。目から点までのカメラ空間ベクトルは、点の位置に等しい。これは非常に小さな最適化であり、おそらくその努力に値するものではありません。私は別離のそのレベルを持っていますが、理にかなって
関連する問題