Java Box2D灯光在场景2D演员绘制之间渲染

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

愚蠢的问题,但我不能删除它。。我已经解决了问题,我是个白痴…: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 = new RayHandler(world);
rayHandler.setShadows(false);
Box2D update(我有一个调试矩阵,因为物理世界是以世界坐标(米)渲染的,然后我将其缩放到像素):

和光:

new PointLight(rayHandler, 128, null, 10, 0, 3);
好的,现在我要做的是:我有一个团队,有一些演员。我有另一个组来保存UI,在第一个组的顶部绘制。我在第一组的绘制完成后立即调用updateWorld(),因此灯光将位于第一组的顶部,第二组的后面。下面是一个快速说明:

开始绘制舞台

演员组

  • 演员

  • 演员

  • 演员

调用Box2D渲染(我们在此处显示灯光)

用户界面组

  • 用户界面参与者面板

  • 用户界面参与者面板

  • 用户界面参与者面板

结束舞台画

以下是结果(非常丑陋):

现在,如果在舞台完成绘制(而不是在演员之间)后调用updateWorld(),情况如下:

它看起来应该是这样的,但它涵盖了舞台和UI

现在,我们回到起点——在舞台渲染时,在actors组之后再次调用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端口测试舞台和灯光

  • 还有很多其他的东西,比如舞台、灯光和矩阵的绘制

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

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


请不要提出不是问题解决方案的解决方案。我不能对灯光、多个舞台、灯光对象的导出图像等使用着色器。。。我需要一个解决这个问题的方法:)

因为我不确定你想要达到什么目的,只需要一些澄清:

  • 每次绘制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 ();
           }