libGDX中shaperenderer的奇怪行为

时间:2018-04-10 19:49:58

标签: opengl libgdx

对于一些背景信息,我正在研究一个带阴影的照明系统。尝试将深色透明色添加到缓冲区时遇到了问题。你会看到我在缓冲区中使用renderOccluders(sr)函数渲染形状。 (sr是我的ShapeRenderer。)这会导致向FBO添加透明的黑色层。而不是这样做设置一个透明的黑色层。然而,一个非常奇怪的事情是,当我将用于绘制形状的代码行移动到缓冲区结束之后,代码确实有效。看似在缓冲区中使用shaperenderer的结果与在缓冲区外使用它不同。

这是我的代码:

    cam.update();
    batch.setProjectionMatrix(cam.combined);
    sr.setProjectionMatrix(batch.getProjectionMatrix());

    Gdx.gl.glClearColor(1,0,0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    buffer.begin(); // Reason for buffer is that blending here is only meant for darkness and light

    Gdx.gl.glClearColor(1,1,1,1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    //renderDarkness();

    Gdx.gl.glEnable(GL20.GL_BLEND);
    Gdx.gl.glBlendFunc(770,771);
    sr.begin(ShapeRenderer.ShapeType.Filled);
    sr.setColor(0,0,0,.5f);

    for (Light light : crtLvl.lights) { light.renderOccluders(sr);}

    sr.end();
    Gdx.gl.glDisable(GL20.GL_BLEND);

    buffer.end();

    sprite_darknessOverlay = new Sprite(buffer.getColorBufferTexture());
    sprite_darknessOverlay.flip(false, true);
    sprite_darknessOverlay.setSize(newWidth,newHeight);
    sprite_darknessOverlay.setPosition(cam.position.x - newWidth / 2, cam.position.y - newHeight / 2);
    sprite_darknessOverlay.setColor(1,1,1,1);
    batch.begin();

    sprite_darknessOverlay.draw(batch);

    batch.end();

我想在缓冲区内渲染形状。有人知道如何使这项工作吗?

1 个答案:

答案 0 :(得分:0)

当绘制到缓冲区时,请记住混合方程的alpha部分突然变得重要,因为它稍后将用于将缓冲区绘制到屏幕上。通常,等式的alpha部分并不重要,因为后缓冲区的最终alpha不用于任何事物。由于它通常无关紧要,您通常可以简单地使用blendFunc而不是blendFuncSeparate。

如果不了解更多有关您如何进行照明的细节,我建议您使用带有alpha 1的清晰颜色,并在绘制到帧缓冲区时使用batch.setBlendFuncSeparate()并将alpha参数设置为GL_ONE,GL_ZERO。然后,在将帧缓冲区的图像绘制到屏幕时,将其颜色的alpha设置为所需的透明度。对于你特别想要做的事情,这可能是错误的,但应该让你开始。