渲染到纹理和路径不消失

我试图用点精灵来实现烟花,然后通过将烟花渲染为两种不同的纹理来绘制轨迹,然后每次将它们绘制回彼此,并将alpha设置为<1,使得每个以前的绘制越来越消失。

它看起来很不错,并且取决于我绘制之前渲染的纹理时使用的alpha值,所预期的轨迹变长或变短。 但是,在大多数设备上(并非全部),这些路径从不会完全消失。 他们应该消失后,他们留下了非常透明但仍然明显的痕迹。

这是我目前所做的:

根据一个叫做second的布尔值,我设置framebuffer渲染到两个纹理之一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值<1渲染之前绘制的纹理。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,因为所有的位图都是默认预乘。

我究竟做错了什么? 有一个更好的方法吗?

感谢您的帮助,Anders


我究竟做错了什么?

总结缩小(在他们的价值观)图像的方式实际上是一个Power系列,指出你的alpha值。 这样的权力系列将减少到零,但从未达到它。

有一个更好的方法吗?

其实这是正确的做法。 你只是忘了最后一步:你想添加一些阈值,这样低于某个alpha值的值就会被钳位到零。 最容易的是,添加一个GL_GREATER alpha测试就可以获得这个测试,阈值略高于您想要移除的路径的alpha值。

链接地址: http://www.djcxy.com/p/33935.html

上一篇: Render To Texture & Trails Not Disappearing

下一篇: Render to texture or offscreen framebuffer