【问题标题】:Render To Texture & Trails Not Disappearing渲染纹理和轨迹不消失
【发布时间】:2012-07-05 10:36:45
【问题描述】:

我正在尝试使用点精灵来实现烟花,然后通过将烟花渲染到两个不同的纹理来绘制轨迹,然后每隔一次将它们相互拉回,并将 alpha 设置为

它看起来不错,根据我在绘制先前渲染的纹理时使用的 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 值

// 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,因为默认情况下所有位图都是预乘的。

我做错了什么?有没有更好的方法来做到这一点?

感谢您的帮助, 安德斯

【问题讨论】:

    标签: android opengl-es framebuffer render-to-texture


    【解决方案1】:

    我做错了什么?

    您对缩小的(按其值)图像求和的方式实际上是一个幂级数,可以将您的 alpha 值指数化。这样的幂级数将渐近为零,但永远不会达到。

    有没有更好的方法来做到这一点?

    其实这是正确的做法。您刚刚忘记了最后一步:您希望添加一些阈值,以便将低于某个 alpha 值的值限制为零。最容易做到这一点的是添加 GL_GREATER alpha 测试,阈值略高于您想要删除的踪迹的 alpha 值。

    【讨论】:

    • 谢谢!那成功了!是否有可能以某种方式将前一个纹理的 alpha (逐个像素)减少一个静态值,例如每次通过 0.01?这样,在给定次数的抽奖之后,alpha 应该总是为零。
    • @是的,您可以通过首先将混合方程切换为减去,用黑色四边形覆盖纹理,减去要减去的 alpha 值和混合方程(GL_SRC_ALPHA,GL_ONE)来做到这一点。然后切换回添加剂混合。不过,我必须自己修改一下。
    • 嗯.. 我对不同的 blendfunc 选项并不是很熟悉,但这真的会减去吗?那不是 src_color * src_alpha + dst_color 吗?当我查看 blencfunc 选项时,我真的看不出只有减法的方法,只能乘法(最终得到的结果与我已经得到的结果相同)...
    • @cmbellman:混合阶段首先根据混合函数预乘源和目标,然后根据选择的混合方程(glBlendEquation)对目标进行加法或减法。如果您使用恒定的目标因子混合函数,则可以从目标中减去。
    • 啊!起初我找不到 glBlendEquation 但它在 GL11ExtensionPack (android) 中,所以在转换 gl 变量时我可以找到它。现在我要做一些测试,如果我没有得到它,我会问一个单独的问题。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多