[英]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.