0

ウィンドウからカメラへの変換を使用して、フラグメントごとのライティングとライトの減衰を実装しました。

vec4 ndcPos;
ndcPos.xy = ((gl_FragCoord.xy / windowSize.xy) * 2.0) - 1.0;
ndcPos.z = (2.0 * gl_FragCoord.z - gl_DepthRange.near - gl_DepthRange.far) / (gl_DepthRange.far - gl_DepthRange.near);
ndcPos.w = 1.0;

vec4 clipPos = ndcPos / gl_FragCoord.w;

vec3 cameraPos = vec3(clipToCameraMatrix * clipPos);

次に、lightPos と cameraPos を使用してライティングを計算します。lightPos は、ワールド空間で固定位置を持ちます。fps スタイルのカメラと ModelMatrix を処理する ViewMatrix があります。以前は、ウィンドウからカメラへの変換の代わりに頂点位置を使用していましたが、すべて問題ありませんでした。カメラを使用してオブジェクトの周りを移動すると、正しくない照明が得られるようになりました。フラグメント シェーダーにアップロードする前に、lightPos は ViewMatrix で乗算されます。

glUniform3fv(dirToLightUniformLocation, 1, glm::value_ptr(ViewMatrix * lightPos));

何が間違っているのかわかりません。

4

2 に答える 2

1

ここに 1 つの問題があります。

ndcPos.z = (2.0 * gl_FragCoord.z - gl_DepthRange.near - gl_DepthRange.far) / (gl_DepthRange.far - gl_DepthRange.near);

正射投影法を使用していない限り、gl_FragCoord.z は深度範囲に線形にマッピングされません。これは w 分割が原因です。逆投影することは可能ですが (難しいことではありません)、追加の可変イン/アウトを使用して、ビュースペースの目の位置を頂点シェーダーからフラグメント シェーダーに渡すことをお勧めします。

于 2012-05-08T08:07:07.810 に答える