GLSL独立发光光源开发问题:多光源出现光效拉伸
问题解决:GLSL双独立发光光源修复
你的代码里有三个关键问题导致光效拉伸:
- 光源位置错误地混入了当前像素的
uv坐标,导致每个像素计算的光源位置都在变化,光效被拉伸 - 距离计算时符号错误,应该是当前点到光源的距离(
uv - glowPos)而非相加 - 没有截断发光值的负数部分,导致暗区干扰发光效果
修正后的代码
void mainImage( out vec4 fragColor, in vec2 fragCoord ) { // 归一化像素坐标,中心为原点,保持宽高比 vec2 uv = (fragCoord - 0.5*iResolution.xy) / iResolution.y; vec3 col = vec3(0.); float radius = 0.5; float glowSpeed = 1.; // 固定光源位置(相对于中心) vec2 glowPos = vec2(0., 0.5); vec2 glowPos2 = vec2(0.5, 0.); // 计算发光强度:动态半径减去到光源的距离,截断负值避免暗区 float glowCol1 = max(0., radius * (cos(glowSpeed * iTime) + 6.) / 7. - length(uv - glowPos)); float glowCol2 = max(0., radius * (cos(glowSpeed * iTime) + 6.) / 7. - length(uv - glowPos2)); // 叠加发光颜色(这里用黄色和青色区分两个光源,也可以保持一致) col += vec3(glowCol1, glowCol1, 0.); col += vec3(0., glowCol2, glowCol2); // 输出到屏幕 fragColor = vec4(col, 1); }
关键修改点说明
- 固定光源位置:
glowPos和glowPos2改为固定坐标,不再依赖当前像素的uv,确保每个像素都以同一个点作为光源计算 - 距离计算修正:用
uv - glowPos计算当前点到光源的欧氏距离,符合发光效果的逻辑 - 截断负值:用
max(0., ...)把发光强度的负数部分置0,避免出现比黑色更暗的区域,让发光效果更纯净 - 可选优化:如果想要更柔和的发光衰减,可以用
smoothstep替代直接相减,比如smoothstep(radius, 0., length(uv - glowPos)),能得到边缘更平滑的光效
内容的提问来源于stack exchange,提问作者Elemental Raccoon
相关产品推荐
相关产品推荐

