【发布时间】:2016-03-18 08:13:52
【问题描述】:
我正在为 Android 编写一个 RTS 游戏,我希望在玩家的单位上添加“战争迷雾”效果。这种效果意味着每个单位周围只有一个“圆圈”显示背景地图,而在没有玩家单位的地方,屏幕应该是黑色的。我不想使用着色器。
我有它的第一个版本。我正在做的是将地图渲染到默认帧缓冲区,然后我有第二个完全黑色的帧缓冲区(类似于灯光技术)。在玩家单位所在的位置,然后我批量绘制一个完全透明的纹理,中间有一个边缘模糊的白色圆圈。 最后,我使用 Gdx.gl.glBlendFunc(GL20.GL_DST_COLOR, GL20.GL_ZERO);
在第一个上绘制第二个(浅色)FrameBuffer 的 colorTexture现在的视觉效果是整个地图确实是黑色的,并且可以看到围绕我的单位的圆圈 - 但是添加了很多白色。 原因很清楚,因为我为这样的单位绘制了光纹理:
lightBuffer.begin();
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE);
Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glClearColor(0.1f, 0.1f, 0.1f, 1f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.setProjectionMatrix(camera.combined);
batch.begin();
batch.setColor(1f, 1f, 1f, 1f);
for (RTSTroopAction i : unitList) {
batch.draw(lightSprite, i.getX() + (i.getWidth() / 2) - 230, i.getY() + (i.getHeight() / 2) - 230, 460, 460); //, 0, 0, lightSprite.getWidth(), lightSprite.getHeight(), false, true);
}
batch.end();
lightBuffer.end();
但是,我不想要原始纹理上的“白色东西”,我只想让原始背景发光。我怎样才能做到这一点?
我认为它正在使用 blendFuncs,但我无法弄清楚要使用哪些值。
【问题讨论】:
-
你应该看看 glsl 着色器的使用或粒子。
-
请注意,当您调用
batch.end()时,直接设置glBlendFunc会被分配给 SpriteBatch 的任何混合函数覆盖。我不清楚为什么要添加白色。如果您使用Gdx.gl.glBlendFunc(GL20.GL_DST_COLOR, GL20.GL_ZERO);,颜色只会变得更暗,因为您只是在相乘。但是,如果您使用精灵批处理将帧缓冲区的纹理绘制到屏幕上,那么这可能不是您实际使用的混合功能。
标签: android opengl-es libgdx framebuffer blending