我正在尝试使用点精灵实现烟花,然后通过将烟花渲染为两个不同的纹理来绘制轨迹,然后每隔一次将它们绘制回彼此,并将alpha设置为< 1,使之前的每一次抽奖都越来越少。
它看起来不错,取决于我在绘制先前渲染的纹理时使用的alpha,路径会变得更长或更短,如预期的那样。然而,在大多数设备(并非所有设备)上,路径永远不会完全消失。在他们应该消失之后,他们留下了一条非常透明但仍然明显的踪迹。
这就是我现在所做的事情:
取决于一个名为second的布尔值,我将帧缓冲区设置为渲染为两个纹理中的一个,称为buff1和buff2。
((GL11ExtensionPack)gl).glBindFramebufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, myFBO.get(0));
if (second){
((GL11ExtensionPack)gl).glFramebufferTexture2DOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, GL11ExtensionPack.GL_COLOR_ATTACHMENT0_OES, GL10.GL_TEXTURE_2D, buff2.texture.textureId, 0);
} else {
((GL11ExtensionPack)gl).glFramebufferTexture2DOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, GL11ExtensionPack.GL_COLOR_ATTACHMENT0_OES, GL10.GL_TEXTURE_2D, buff1.texture.textureId, 0);
}
gl.glViewport(0, 0, bufferSize, bufferSize);
gl.glClearColor(0, 0, 0, 0);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
然后,我使用alpha值< buff对象只是绘制带纹理的四边形的助手。绘图功能将alpha预乘到其他颜色通道。
// a = alpha, higher value = longer trails = more distinct leftovers
if (second){
buff1.setColor(1, 1, 1, a);
buff1.draw(gl);
second = false;
else {
buff2.setColor(1, 1, 1, a);
buff2.draw(gl);
second = true;
}
之后我会画点精灵烟花。还使用预乘alpha和gl.glBlendFunc(GL10.GL_ONE,GL10.GL_ONE_MINUS_SRC_ALPHA);
最后,我重置了帧缓冲区并让我的新纹理包含旧路径渐变,当前烟花在顶部以100%alpha绘制。然后我使用这个纹理与烟花纹理背后和前面的所有其他对象一起绘制到我的场景。
正如我所说的,几乎所有东西都在工作,除了那些几乎透明的小径停留在小路应该已经褪色之后。绘制前一个缓冲区的alpha值越高,留下永久停留的“残羹剩饭”就越明显。
我一直尝试使用不同的混合模式,预乘和不预乘alpha等。但由于这是一个android opengl es 1.1,我认为混合应该是GL_ONE和GL_ONE_MINUS_SRC_ALPHA,因为默认情况下所有位图都是预乘的。 / p>
我做错了什么?有更好的方法吗?
感谢您的帮助, 安德斯
答案 0 :(得分:2)
我做错了什么?
你缩小(在它们的值中)图像的总和的方式实际上是一个幂数系列,用于表示你的alpha值。这样的权力系列将无法实现零,但永远不会达到它。
有更好的方法吗?
实际上这是正确的方法。您只是忘记了最后一步:您希望添加一些阈值,以便低于某个alpha值的值被限制为零。最容易实现的是添加GL_GREATER alpha测试,其阈值略高于您想要移除的路径的alpha值。