【发布时间】:2016-12-18 03:21:46
【问题描述】:
我正在尝试在基于 libGDX 的游戏上实现一个简单的 2D 光引擎。这个想法是在没有着色器的情况下创建这个光引擎。我暂时不打算渲染任何阴影。 我已经设法用三角形和渐变渲染了一个光照贴图,但问题是当多个光源重叠时,我得到了一些像这张图片中的伪影:
黄色光源与其他光源重叠时会产生深色边框。
我正在使用以下混合函数来渲染灯光:
Gdx.gl.glBlendFunc(GL20.GL_ONE, GL20.GL_ONE);
有没有办法去掉这个黑边?
渐变从黄色变为黑色,完全不透明。因为GL_ONE 应该是加色的,所以颜色应该只会变亮吧?
更新 1:
使用 Nico Schertler 解释的着色器肯定更好,但仍有一些参数我不确定。
这是我想出的片段着色器
void main() {
float intensity = 0.02;
vec2 pos = vPosition;
float dist = distance(pos, u_origin) / u_radius;
vec4 color = vec4(intensity * (vColor.rgb / ((dist * dist) + 0.01)), 1);
gl_FragColor = color;
}
问题是我不确定常量intensity = 0.02 和0.01 我已添加到函数中以使其看起来不错。此外,半径变量现在是屏幕高度和宽度之间的最大值。
更新 2:
我最终选择了以下等式:
void main() {
float dist = distance(vPosition, u_origin) / u_radius;
vec4 color = vec4((vColor.rgb) / (pow(dist, 2) + 0.01), vColor.a);
gl_FragColor = color;
}
然后结合基于相同方程的遮挡贴图(使未照亮的地方变暗)。这是最终输出:
【问题讨论】:
-
那个较暗的带是一种错觉。欢迎您使用任何图形编辑器检查这些值,看看它们是否变暗 :) 目前看来您没有使用 sRGB 进行渲染,但您应该这样做。还有其他的东西,比如二次衰减,可能会掩盖这一点。