愚蠢的问题,但我无法删除它..我已经解决了问题,我是个白痴......:D
我有 Libgdx scene2d 舞台和 Actor 。我需要在 Actor 之间渲染 Box2D Lights(v. 1.4),因此结构如下所示:
Actor , Actor ,灯光,灯光, Actor
我的舞台渲染:
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 更新(我有一个调试矩阵,因为物理世界正在世界坐标(米)中渲染,然后我将其缩放到像素):
public void updateWorld(float deltaTime) {
world.step(deltaTime, 7, 7);
// i know that this is not optimized to be called on every frame
debugMatrix = new Matrix4(stage.getCamera().combined.cpy());
debugMatrix.scale(ratio, ratio, 1);
rayHandler.setCombinedMatrix(debugMatrix);
rayHandler.updateAndRender();
}
还有光:
new PointLight(rayHandler, 128, null, 10, 0, 3);
好吧,现在我要做的就是:我有一个包含一些 Actor 的小组。我有另一个包含 UI 的组,绘制在第一个组的顶部。我在第一组绘制完成后立即调用 updateWorld() ,因此灯光将位于第一组的顶部和第二组的后面。这是一个快速说明:
Start the drawing of the stage
Actors Group
Actor
Actor
Actor
Box2D render is called (we display the lights here)
UI Group
UI Actor panel
UI Actor panel
UI Actor panel
End the drawing of the stage
这是结果(非常难看):
现在,如果我在舞台完成绘制后调用 updateWorld() (不是在 Actor 之间),效果如下:
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
super.render();
stage.act();
stage.draw();
updateWorld(deltaTime);
它看起来应该是这样,但它覆盖了舞台和 UI。
现在,我们回到起点 - 在 Actor 组之后再次调用 updateWorld(),同时舞台正在渲染。我们修改stage的batch的投影矩阵:
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();
结果(光线仍然很酷,但 scene2d 已损坏 - UI 中的所有 Actor 都消失了):
我测试了很多东西(我已经尝试寻找解决方案 3 天了):
我更改了投影和变换矩阵;
改变矩阵,绘制灯光并恢复之前的矩阵;
使用不同的摄像机和视口(viewport)对舞台和灯光进行测试;
以及舞台绘制、灯光批处理和矩阵等许多其他内容
我认为 LibGDX 在绘制舞台时以某种方式改变了 OpenGL 绘图。我不知道该怎么办,我不完全确定 OpenGL 是如何工作的。如何使光线看起来不错(如屏幕截图 2 和 3 所示)?
更新: 我知道我可以制作两个独立的阶段并在它们之间绘制灯光 - 这会没问题,但我的结构要复杂得多(我只是简单地解释它)......所以我不能那样做(或者我需要 4-5 个不同的阶段,这是一个糟糕的解决方案)
请不要提出不能解决问题的解决方案。 我无法对灯光、多个阶段、导出的灯光对象图像等使用着色器...我需要解决此问题:)
最佳答案
您的问题可能是因为您的 AfterDrawListener
为给定 Actor 的每个 child 调用一次(我假设您正在使用《第六锤》的修改后的 scene2d)。无论如何,请尝试检查绘制后事件是否来自同一对象。
关于java - Box2D 灯光在 scene2d Actor 绘制之间渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36156900/