法線マッピングとサーフェスがライトから離れているという問題に遭遇しました。これらのサーフェスは、光に面していないため、まったく照らされるべきではありません。ただし、フラグメントの法線がたまたま十分に曲がっている場合、これらのサーフェスからかなりの数のフラグメントが照らされる可能性があります。これによって引き起こされたアーティファクトは、たとえば、一方の側面が光から直接離れたところを向いているボックスではっきりと見えます: その側面のほとんどすべての破片は (想定どおり) 黒ですが、まだいくつかの白い破片が表示されています (申し訳ありませんが、スクリーンショットはありません)。現在利用可能ですが、通常のマッピングを行ったことがある場合は、私が話していることを理解する必要があります)。
フォワード レンダラーでこれを修正する簡単な方法を見つけました。光の強度を (4*lightDirection.Z) で乗算するだけです。理由は、ライト ベクトルとサーフェスの法線ベクトルの(クランプされた) 内積をライトの強度に掛ける必要があるためです(面が向こうを向いている場合、内積は負になり、ライトの強度は 0 にクランプされます)。タンジェント スペースでは、この法線は常に (0,0,1) であるため、内積は単に lightDirection.z です。乗数 4 は、光の強度が低下しないようにするためだけに存在します (面が向きを変えていない場合)。
今、遅延レンダラーに同じ機能を実装しようとしましたが、ワールド空間で計算を行っているため、この単純なアプローチが機能しないことにすぐに気付きました。この計算を行うには、そのフラグメントの実際の法線と、このフラグメントが配置されているサーフェスの法線の両方が必要です。もちろん、この情報をテクスチャに保存することもできますが、このトリックを行うためだけにさらに 3 つのフロート (パックする場合は 2 つ) を費やすと、かなりコストがかかります。
回避策はありますか?
ありがとうございました。