虽然我的问题严重在于tristrip的不透明性,但我想首先给出一些背景。
最近我开始通过LibGdx开发一款游戏,它涉及在屏幕上反弹的2D圆圈。为了提供一个整洁的图形效果,我创建了一个小型系统,可以为演员提供“尾巴”,随着时间的推移会逐渐消失。在视觉上,它看起来像这样:
现在结果看起来令人满意。然而,我的问题在于“线索”效果的某些部分重叠,造成一种丑陋的神器,我猜这是一种不透明度的总和。
我认为这个问题在于绘制ttrtrip的方式,特别是使用的混合方法。 用于生成跟踪的代码如下:
Array<Vector2> tristrip = new Array<Vector2>(); //Contains the vector information for OpenGL to build the strip.
Array<Vector2> texcoord = new Array<Vector2>(); //Contains the opacity information for the corresponding tristrip point.
// ... Code Here.... //
gl20.begin(camera.combined, GL20.GL_TRIANGLE_STRIP);
for (int i = 0; i < tristrip.size; i++) {
if (i == batchSize) {
gl20.end();
gl20.begin(camera.combined, GL20.GL_TRIANGLE_STRIP);
}
Vector2 point = tristrip.get(i);
Vector2 textcoord = texcoord.get(i);
gl20.color(color.r, color.g, color.b, color.a); // Color.WHITE
gl20.texCoord(textcoord.x, 0f);
gl20.vertex(point.x, point.y, 0);
}
gl20.end();
同样重要的是要注意,条带的绘制函数以这种方式在另一个类中调用:
private void renderFX() {
Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
Array<Ball> balls = mainstage.getBalls();
for (int i = 0; i < balls.size; i++) { //Draws the trails for each actor
balls.get(i).drawFX();
}
}
这个问题对我来说是一个新手的错误,还是我从一开始就对矢量数组 tristrip 的绘制实现有缺陷?如何修复混合问题,以便在有曲线的情况下创建更平滑的轨迹?
提前致谢...
编辑:自从最初提出这个问题以来,我已经尝试了一些可能的解决方案,同时实施了DenizYılmaz建议使用FBO来促进混合。鉴于此,我的渲染功能目前看起来像这样:
private void renderFX() {
frameBuffer.begin();
Gdx.gl20.glDisable(GL20.GL_BLEND);
Gdx.gl20.glClearColor(0f, 0f, 0f, 0);
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
Gdx.gl20.glEnable(GL20.GL_STENCIL_TEST);
Gdx.gl20.glStencilOp(GL20.GL_KEEP, GL20.GL_INCR, GL20.GL_INCR);
Gdx.gl20.glStencilMask(0xFF);
Gdx.gl20.glClear(GL20.GL_STENCIL_BUFFER_BIT);
Array<Ball> balls = mainstage.getBalls();
for (int i = 0; i < balls.size; i++) {
Gdx.gl20.glStencilFunc(GL20.GL_EQUAL, 0, 0xFF);
balls.get(i).drawFX(1f, Color.RED);
}
frameBuffer.end();
}
如图所示,我还试验过模板,试图掩盖路径的重叠部分。然而,这种方法产生以下视觉效果:
同样,这并不理想,并且让我意识到通过遮蔽来解决这个问题并不是一个好主意,因为不透明度渐变在角落里永远不会是平滑的,因为在两个重叠之间总会有一条尖锐的线条不透明度值,即使逻辑以某种方式阻止混合。
鉴于此,我怎么能解决这个问题呢?如果我打算为此追踪效果实现平滑渐变,我是否应该完全废弃此方法?
再次感谢。
答案 0 :(得分:1)
glBlendFunc()在这种情况下没用,因为默认情况下会添加基于混合函数计算的值。
所以像glBlendEquation(GL_MAX)这样的东西需要
但是
单独混合不会起作用,因为它无法区分什么是背景和什么是重叠形状。而是使用FrameBuffer绘制glBlendEquation的跟踪。
https://github.com/mattdesl/lwjgl-basics/wiki/FrameBufferObjects