簡體   English   中英

OpenGL延遲渲染:點光源實現

[英]OpenGL deferred rendering: point light implementation

我正在嘗試使用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;

    float attenuation = clamp(1.0 - length(toLight)/LightRadius,0.0,1.0); 

    toLight = normalize(toLight);

    float nDotL = max(dot(pixelNormal, toLight),0.0);

    vec3 diffuseLight = diffuseColor * nDotL;

    LightMap = LightIntensity * attenuation * vec4(diffuseLight,1.0);

結果: 結果

看起來不錯。 但是,光線是在10 * 10的平面上,並且光線的半徑是5,所以光線應該幾乎覆蓋整個表面。

我了解問題,只是不知道如何解決...

正常問題

其他像素的nDotL將更小,從而導致這種“偽像”。

如果刪除“ * nDotL”部分,則指示燈如下所示:

在此處輸入圖片說明

在這種情況下,范圍很好,但地板的底部也亮了...

如果有人可以告訴我如何解決此問題,我將不勝感激。

如果需要,源代碼也位於此處。

當結合使用“衰減+擴散”時,閃電會變暗是正常的。 如果它們都不是1.0(而是0.0,1.0之間的某個值),則將兩者相乘會得到較暗的結果。 您應該增加燈光的強度。 你可以做

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

它會給您更柔和的衰減效果,並允許您增加燈光效果以照亮更大的半徑。

vec3 distance = toLight * (1.0 / LightRadius);
float attenuation = clamp(1 - dot(distance, distance), 0, 1);
attenuation = attenuation * attenuation;

使用此“公式”,看起來它正在按預期方式工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM