OpenGL での Oren-Nayar ライティング (フラグメント シェーダーでビュー方向を計算する方法)

最初に、ビュー/法線/ライト ベクトルを使用してフラグメント シェーダーをレンダラーにプラグインしましたが、完全に機能します。したがって、問題はこれらのベクトルを計算する方法にあるはずです.

次に、あなたは view_dir を設定したと言います カメラの正面ベクトルに。 「ワールド空間でのカメラの正面ベクトル」を意味していると思いますが、これは正しくありません。カメラ空間のベクトルで内積を計算するので、view_dir もカメラ空間にある必要があります。それは vec3(0,0,1) です それを確認する簡単な方法になります。動作する場合 -- 問題が見つかりました。

ただし、 (0,0,1) を使用 透視投影を行う場合、ビューの方向は厳密には正しくありません。フラグメントからカメラへの方向は、画面上のフラグメントの位置に依存するためです。正しい数式は view_dir = normalize(-pos) になります どこで pos カメラ空間でのフラグメントの位置です (つまり、投影なしでモデル ビュー マトリックスが適用されます)。さらに、この量は画面上のフラグメントの位置のみに依存するようになったため、次のように計算できます:

view_dir = normalize(vec3(-(gl_FragCoord.xy - frame_size/2) / (frame_width/2), flen))

flen flen = cot(fovx/2) として計算できるカメラの焦点距離です。 .