1

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」部分を削除すると、ライトは次のようになります。

ここに画像の説明を入力

この場合、範囲は問題ありませんが、床の下部も点灯しています...

誰かがこれを修正する方法を教えていただければ幸いです。

必要に応じて、ソースコードもここにあります。

4

2 に答える 2

1

Decay + Diffuse を組み合わせると、稲妻が暗くなるのが普通です。それらは 1.0 ではない (ただし、0.0,1.0 の間の値) ため、両方を乗算すると、より暗い結果が得られます。光の強さを増やさなければなりません。できるよ

lightStrength / (ConstantDecay + distance*LinearDecay + distance*distance*CuadraticDecay). 

これにより、よりソフトな減衰が得られ、ライト効果を増加させてより多くの半径を照らすことができます。

于 2015-03-31T07:58:37.810 に答える
0
vec3 distance = toLight * (1.0 / LightRadius);
float attenuation = clamp(1 - dot(distance, distance), 0, 1);
attenuation = attenuation * attenuation;

この「式」を使用すると、正常に機能しているように見えます。

于 2015-04-26T10:04:05.207 に答える