Java Box2D灯光在场景2D演员绘制之间渲染
愚蠢的问题,但我不能删除它。。我已经解决了问题,我是个白痴…:D 我有Libgdx场景2D舞台和演员。我需要渲染演员之间的Box2D灯光(1.4版),因此结构如下所示: 演员,演员,灯光,灯光,演员 我的舞台渲染:Java Box2D灯光在场景2D演员绘制之间渲染,java,opengl,libgdx,box2d,scene2d,Java,Opengl,Libgdx,Box2d,Scene2d,愚蠢的问题,但我不能删除它。。我已经解决了问题,我是个白痴…:D 我有Libgdx场景2D舞台和演员。我需要渲染演员之间的Box2D灯光(1.4版),因此结构如下所示: 演员,演员,灯光,灯光,演员 我的舞台渲染: Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); super.render(); stage.act(); stage.draw(); 我的Box2D代码: rayHandler
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
super.render();
stage.act();
stage.draw();
我的Box2D代码:
rayHandler = new RayHandler(world);
rayHandler.setShadows(false);
Box2D update(我有一个调试矩阵,因为物理世界是以世界坐标(米)渲染的,然后我将其缩放到像素):
和光:
new PointLight(rayHandler, 128, null, 10, 0, 3);
好的,现在我要做的是:我有一个团队,有一些演员。我有另一个组来保存UI,在第一个组的顶部绘制。我在第一组的绘制完成后立即调用updateWorld(),因此灯光将位于第一组的顶部,第二组的后面。下面是一个快速说明:
开始绘制舞台
演员组
- 演员
- 演员
- 演员
- 用户界面参与者面板
- 用户界面参与者面板
- 用户界面参与者面板
debugMatrix = new Matrix4(stage.getCamera().combined.cpy());
debugMatrix.scale(ratio, ratio, 1);
// this line was added
stage.getBatch().setProjectionMatrix(debugMatrix.cpy());
rayHandler.setCombinedMatrix(debugMatrix);
rayHandler.updateAndRender();
结果(光线仍然很冷,但是场景2D被破坏了——UI中的所有演员都消失了):
我已经测试了很多东西(我已经尝试了3天的解决方案):
- 我改变了投影和变换矩阵
- 更改矩阵,绘制灯光并恢复以前的矩阵
- 用不同的摄像机和VIE端口测试舞台和灯光
- 还有很多其他的东西,比如舞台、灯光和矩阵的绘制
请不要提出不是问题解决方案的解决方案。我不能对灯光、多个舞台、灯光对象的导出图像等使用着色器。。。我需要一个解决这个问题的方法:)因为我不确定你想要达到什么目的,只需要一些澄清:
- 每次绘制Box2Lights光线处理程序时,实际上都会在之前绘制的上方绘制一个黑色正方形。这个黑色正方形在特定区域是透明的(这些区域是“灯光”)
- 因此,如果绘制多个灯光层,则上面的层将使下面的层变暗
- Box2Lights使用OpenGl着色器混合场景上方的黑色方形。您还可以实现自己的着色器以在此处使用
- 因此,这里最有用的方法是只使用一个灯光层,该灯光层绘制在所有“游戏”演员的上方,但在用户界面下方
- 您的问题可能是因为您的
AfterDrawListener
对于给定演员的每个孩子都会调用一次(我假设您使用的是第六个锤子的修改场景2d)。无论如何,请尝试检查后绘制事件是否来自同一对象。谢谢您的提问。
我也在寻找答案,似乎我找到了
public void draw (Batch batch, float parentAlpha)
{
batch.end ();
rayHandler.updateAndRender ();
batch.begin ();
}
好的,但是他如何在某个演员之后和stage draw()方法结束之前绘制灯光层,因为他需要在画布演员之后,但在覆盖面板之前渲染灯光?正如您已经提到的,这里可以使用两个阶段。如果您只有一个灯光层,这应该不会太复杂。否则你必须单独画演员,就像我提到的,我的结构要复杂得多,所以我不能用两个阶段。。。如果我单独绘制演员,我基本上会覆盖stage.draw()方法。。那么有什么区别呢?如果你解决了它,为什么不回答你自己的问题呢?因为我很笨,问题不在opengl或libgdx中-似乎我一直在调用updateWorld()方法/它每帧绘制灯光/10次,而不是像我应该的那样一次。。。。。
debugMatrix = new Matrix4(stage.getCamera().combined.cpy());
debugMatrix.scale(ratio, ratio, 1);
// this line was added
stage.getBatch().setProjectionMatrix(debugMatrix.cpy());
rayHandler.setCombinedMatrix(debugMatrix);
rayHandler.updateAndRender();
public void draw (Batch batch, float parentAlpha)
{
batch.end ();
rayHandler.updateAndRender ();
batch.begin ();
}