对于一些背景信息,我正在研究一个带阴影的照明系统。尝试将深色透明色添加到缓冲区时遇到了问题。你会看到我在缓冲区中使用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();
我想在缓冲区内渲染形状。有人知道如何使这项工作吗?
答案 0 :(得分:0)
当绘制到缓冲区时,请记住混合方程的alpha部分突然变得重要,因为它稍后将用于将缓冲区绘制到屏幕上。通常,等式的alpha部分并不重要,因为后缓冲区的最终alpha不用于任何事物。由于它通常无关紧要,您通常可以简单地使用blendFunc而不是blendFuncSeparate。
如果不了解更多有关您如何进行照明的细节,我建议您使用带有alpha 1的清晰颜色,并在绘制到帧缓冲区时使用batch.setBlendFuncSeparate()
并将alpha参数设置为GL_ONE,GL_ZERO。然后,在将帧缓冲区的图像绘制到屏幕时,将其颜色的alpha设置为所需的透明度。对于你特别想要做的事情,这可能是错误的,但应该让你开始。