java - Box2D 灯光在 scene2d Actor 绘制之间渲染

标签 java opengl libgdx box2d scene2d

愚蠢的问题,但我无法删除它..我已经解决了问题,我是个白痴......: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

这是结果(非常难看):

enter image description here

现在,如果我在舞台完成绘制后调用 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);

enter image description here

它看起来应该是这样,但它覆盖了舞台和 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 都消失了):

enter image description here

我测试了很多东西(我已经尝试寻找解决方案 3 天了):

  • 我更改了投影和变换矩阵;

  • 改变矩阵,绘制灯光并恢复之前的矩阵;

  • 使用不同的摄像机和视口(viewport)对舞台和灯光进行测试;

  • 以及舞台绘制、灯光批处理和矩阵等许多其他内容

我认为 LibGDX 在绘制舞台时以某种方式改变了 OpenGL 绘图。我不知道该怎么办,我不完全确定 OpenGL 是如何工作的。如何使光线看起来不错(如屏幕截图 2 和 3 所示)?

更新: 我知道我可以制作两个独立的阶段并在它们之间绘制灯光 - 这会没问题,但我的结构要复杂得多(我只是简单地解释它)......所以我不能那样做(或者我需要 4-5 个不同的阶段,这是一个糟糕的解决方案)

请不要提出不能解决问题的解决方案。 我无法对灯光、多个阶段、导出的灯光对象图像等使用着色器...我需要解决此问题:)

最佳答案

您的问题可能是因为您的 AfterDrawListener 为给定 Actor 的每个 child 调用一次(我假设您正在使用《第六锤》的修改后的 scene2d)。无论如何,请尝试检查绘制后事件是否来自同一对象。

关于java - Box2D 灯光在 scene2d Actor 绘制之间渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36156900/

相关文章:

c++ - 在 64 位操作系统中使用 glMultiDrawElements

java - 如何使字体文本可点击?

java - 当使用 Java 的 Runtime.getRuntime().exec() 运行时,从源代码构建 Go 测试失败

java - 将 ArrayList<Custom Object> 保存到本地存储

java - log4j xml配置错误

具有硬件加速 3D 图形的 Java 小程序? OpenGL 和/或 DirectX

opengl - 在 OpenGL 3.x 中使用索引顶点数组时,如何指定每个面的颜色?

android - LibGDX - 来自自定义类的 Sprite 未显示

java - 如何翻转像素图以绘制到 libgdx 中的纹理?

java - 如何在java中将标签显示为框架背景?