Opengl OpengGL灯光混合

Opengl OpengGL灯光混合,opengl,rendering,alphablending,blending,Opengl,Rendering,Alphablending,Blending,我正在使用Java和LWJGL为我的游戏编写一个灯光/阴影系统。对于每个发光实体,我生成这样的纹理: 我应该警告您,这些纹理充满(0,0,1)或(1,0,0)像素,并且渐变效果是通过alpha通道实现的。我将Alpha通道解释为梯度因子 之后,我希望将每个灯光/阴影纹理混合在一个纹理上,每个纹理都位于其各自的正确位置。为此,我使用帧缓冲区。我尝试使用以下混合方程/函数组合来达到预期效果: glBlendEquationSeparateEXT(GL_FUNC_ADD, GL_MAX); glB

我正在使用Java和LWJGL为我的游戏编写一个灯光/阴影系统。对于每个发光实体,我生成这样的纹理:

我应该警告您,这些纹理充满(0,0,1)或(1,0,0)像素,并且渐变效果是通过alpha通道实现的。我将Alpha通道解释为梯度因子

之后,我希望将每个灯光/阴影纹理混合在一个纹理上,每个纹理都位于其各自的正确位置。为此,我使用帧缓冲区。我尝试使用以下混合方程/函数组合来达到预期效果:

glBlendEquationSeparateEXT(GL_FUNC_ADD, GL_MAX);
glBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_DST_ALPHA, GL_ONE, GL_ONE);
我为Alpha通道混合函数任意选择了GL_ONE/GL_ONE,因为GL_MAX只会执行MAX(Sa,Da),如上所述,这意味着不使用缩放因子。这种组合的结果如下: 这张图片是用苹果的OpenGL驱动程序分析器获得的,所以我没有用我的应用程序渲染它(这可能会影响最终结果)。下一步是使用“倍增混合”在实际游戏中渲染此纹理,以使图像变暗,但“灯光/阴影”纹理显然是错误的,因为我们可以看到各个灯光/阴影纹理的边缘

我应该如何着手实现预期的结果

编辑: 我忘了解释我对比例因子的选择:
我认为简单地添加每个灯光的颜色(考虑每个灯光各自的alpha值)并选择最终片段的alpha作为每个重叠灯光的最大值是正确的。

想象一下,您的一个纹理矩形以某种任意模式延伸到其当前边界之外,我喜欢纯绿色。进一步想象一下,我们不知何故被允许使用两个不同的混合函数,一个在边界内,一个在边界外。如果在边界外使用“混合”函数,您将获得与此处相同的图像(没有显示绿色)

glBlendFuncSeparateEXT(GL_ZERO, GL_ONE, GL_ONE, GL_ONE)
然后,我们希望我们在内部使用的任何混合函数都能给我们一个连续的混合结果。混合函数

glBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_DST_ALPHA, GL_ONE, GL_ONE)
不会给我们这样的结果。这并不是因为第一个参数意味着忽略边界附近的源(如果我正确阅读图像描述,边界上的小alpha)。所以它一定是第二个参数。只有当源alpha很小时,我们才需要目标。将
GL_DST_ALPHA
更改为
GL_ONE_减去SRC_ALPHA
。这会更标准,但也许我不理解你的目标