0

ポイント ライト シャドウイングの機能を記述しようとしています。最初はスポットライト シャドウイングが機能していましたが、次にポイント ライト シャドウイングに切り替えると (キューブ マップを使用したり、6 つの POV から深度をレンダリングするなどして...)、市松模様の光のパターンが得られるようになりました (シャドウなし)。これがなぜなのかについて、誰かが直感を持っていますか?

スクリーンショットは次のとおりです。チェッカーボードのスクリーンショット

(よく見ると、立方体の前面が三角形のすぐ右側にある状態でキューブマップがレンダリングされていることがはっきりとわかります)

そして、これが私のレンダー パス フラグメント シェーダー glsl コードです (残りの部分を見たい場合は、それも投稿できますが、これが重要な部分であると考えました)。

注: 私はディファード ライティングを使用しているため、このパスの頂点シェーダーは単なるクワッドであり、pos_tex、norm_tex、および col_tex は、前のパスで生成されたジオメトリ バッファーからのものです。

#version 330 core

in vec2 UV;
out vec3 color;

uniform vec3 lightPosVec; //Non rotation affine

uniform sampler2D pos_tex;
uniform sampler2D col_tex;
uniform sampler2D norm_tex;
uniform samplerCubeShadow shadow_tex;
uniform sampler2D accum_tex; //the tex being drawn to

void main()
{
  vec3 lightToFragVec = texture(pos_tex, UV).xyz-lightPosVec;
  vec3 l2fabs = abs(lightToFragVec);
  float greatestMagnitudeOfLightToFragVec = max(l2fabs.x, max(l2fabs.y, l2fabs.z));
  float lightToFragDepth = ((100.0+0.1) / (100.0-0.1) - (2*100.0*0.1)/(100.0-0.1)/greatestMagnitudeOfLightToFragVec + 1.0) * 0.5;
  float shadowed = texture(shadow_tex, vec4(normalize(lightToFragVec),lightToFragDepth));

  color = 
  texture(accum_tex, UV).xyz+                                        //current value
  texture(col_tex, UV).xyz                                           //frag color
  *dot(lightPosVec-texture(pos_tex,UV).xyz,texture(norm_tex,UV).xyz) //dot product of angle of incidence of light to normal
  *(4+15*shadowed)                                                   //shadow amplification
  /max(0.000001,dot(lightToFragVec,lightToFragVec));                 //distance cutoff
}

ありがとうございました!

編集: わかりました、それで私はそれをいじっていました、そして今、テクスチャはランダムに見えます... 変な表示のスクリーンショット

これは、深度キューブがノイズでいっぱいだと思いますか? samplerCubeShadow を使用した texture() 関数が 1.0 を返すには、その時点での値がそのフラグメントでの深さの値と正確に一致する必要があるためです。また、wasd+up+down でライトの位置を制御するように設定してあり、ライトの動きに合わせてパターンが移動します (バックすると大きく/暗くなります)。つまり、値は実際の距離に合わせて動的に変化しなければならないということですか? ああ、私は混乱しています...

EDIT 2 わかりました、申し訳ありませんが、この質問は制御不能ですが、将来同様の問題を抱えている人のために、進捗状況を記録し続けると思いました。

とにかく、シャドウキューブマップで texture() に渡された 4d ベクトルの 4 番目のコンポーネントとして何を入れても、まったく同じ結果が得られることがわかりました。同様に、定数を入れることもでき、まったく同じ結果が得られます。そんなことがあるものか?

編集3 ダーン。エラーは、私が今言ったこととは何の関係もないことがわかりました。詳細については、以下の回答を参照してください:(

4

1 に答える 1

0

ダーン。私はただのばかだということがわかりました。間違った順序でレンダリングしているだけで、結局、シェーダー コードに問題はありませんでした。したがって、チェッカーボードはテクスチャのノイズによるものでした。ノイズがまだレンダリングされる理由は、私が GL_TEXTURE_COMPARE_FUNC GL_LEQUAL を使用していたため (そうあるべきです)、ノイズが 1 を大きく下回るか 1 を大きく上回ったため、ライトをどこに移動しても問題ありませんでした。

于 2014-03-22T21:22:49.207 に答える