C# と OpenGL (OpenTK を使用) を使用して遅延レンダラーを作成しようとしています。
しかし、ポイント ライトの通常の計算をどのように実装すればよいかわかりません。
ポイント ライト フラグメント シェーダ:
vec2 texCoord = gl_FragCoord.xy / ScreenSize; vec3 pixelPos = texture2D(PositionBuffer,texCoord).xyz; vec3 pixelNormal = normalize(texture2D(NormalBuffer, texCoord).xyz); vec3 diffuseColor = texture2D(ColorBuffer, texCoord).xyz; vec3 toLight = LightCenter - pixelPos; フロート減衰 = クランプ (1.0 - 長さ (ライトまで)/LightRadius,0.0,1.0); toLight = normalize(toLight); float nDotL = max(dot(pixelNormal, toLight),0.0); vec3 拡散ライト = 拡散カラー * nDotL; LightMap = LightIntensity * 減衰 * vec4(diffuseLight,1.0);
結果:
それはうまく見えます。ただし、ライトは 10*10 の平面上にあり、ライトの半径は 5 であるため、ライトはサーフェスをほぼカバーするはずです。
問題は理解できたが、それを修正する方法がわからない...
それ以上のピクセルの nDotL は小さくなり、この「アーティファクト」につながります。
「* nDotL」部分を削除すると、ライトは次のようになります。
この場合、範囲は問題ありませんが、床の下部も点灯しています...
誰かがこれを修正する方法を教えていただければ幸いです。