我正在尝试使用 C# 和 OpenGL(使用 OpenTK)编写一个延迟渲染器。
但是不明白我应该如何实现点光源的正常计算。
点光源片段着色器:
vec2 texCoord = gl_FragCoord.xy / ScreenSize; vec3 pixelPos = texture2D(PositionBuffer,texCoord).xyz; vec3 pixelNormal = normalize(texture2D(NormalBuffer, texCoord).xyz); vec3diffuseColor = texture2D(ColorBuffer, texCoord).xyz; vec3 toLight = LightCenter - pixelPos; 浮动衰减 = 钳位(1.0 - 长度(toLight)/LightRadius,0.0,1.0); toLight = 归一化(toLight); 浮动 nDotL = max(dot(pixelNormal, toLight),0.0); vec3diffuseLight =diffuseColor * nDotL; LightMap = LightIntensity * 衰减 * vec4(diffuseLight,1.0);
结果:
看起来不错。但是光线是在一个10*10的平面上,光线的半径是5,所以光线应该几乎覆盖了这个表面。
我明白这个问题,我只是不知道如何解决它......
更多像素的 nDotL 会更小,这会导致这种“伪影”。
如果我删除“* nDotL”部分,灯光看起来像这样:
在这种情况下,范围很好,但地板的底部也被点亮了......
如果有人能告诉我如何解决这个问题,我将不胜感激。