我试图实现与点精灵的烟花,然后通过将烟花渲染到两个不同的纹理,然后绘制它们回到对方每隔一次与alpha设置为< 1,使得以前的每张画都越来越消失。渲染纹理和路径不消失
它看起来不错,并且取决于我绘制之前渲染的纹理时使用的alpha值,路径变得更长或更短,如预期的那样。但是,在大多数设备上(并非全部),这些路径从不会完全消失。他们应该消失后,他们留下了非常透明但仍然明显的痕迹。
这是我目前做的:
取决于所谓的第二布尔我设置的帧缓冲渲染两个纹理称为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);
然后我渲染对当前一个先前绘制的质地,使用α值< 1.抛光轮对象只是一个帮手绘制与纹理四边形。绘图函数预先将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,因为所有的位图都是默认预乘。
我在做什么错?有一个更好的方法吗?
感谢您的帮助, 安德斯
谢谢!这就是诀窍!在某种程度上,是否有可能用一个静态值来减少先前纹理的alpha值(逐个像素),比如说每个通道都是0.01?这样,在给定次数的抽签后,阿尔法应该总是达到零。 – cmbellman 2012-07-05 13:54:52
@您可以通过首先将混合方程式切换为减法,用黑色四边形绘制纹理,使用要减去的alpha值和混合方程(GL_SRC_ALPHA,GL_ONE)来完成此操作。然后切换回添加混合。尽管如此,我不得不自己修改一下。 – datenwolf 2012-07-05 19:03:05
嗯..我不是很熟悉不同的blendfunc选项,但真的会减去吗?那不是src_color * src_alpha + dst_color?当我看着blencfunc选项时,我真的无法真正看到减法的方法,只能乘以(最终会得到与我已有的结果相同的结果)... – cmbellman 2012-07-06 10:30:04