成块绘制等轴测图吗?

时间:2018-09-07 10:50:58

标签: java opengl libgdx drawing

我想减少对等轴测图实现的绘制调用,因此我考虑了将多个网格合并并一次性绘制的想法。我目前正在使用8x8“块”中的所有图块创建网格。这意味着包含地板,墙壁和物体的网格。这些地板,墙壁和物体只是沿着Y向上的规则轴放置的四边形。旋转的正交摄影机提供等轴测投影矩阵。大多数地板和墙壁以不透明的纹理填充整个四边形,但是有些和大多数对象具有alpha透明度,例如窗户,破碎的地板或椅子对象。我正在通过向其添加单个网格来构建“块”网格,我这样做是按照从前到后,从下到上绘制的顺序进行的,否则根本无法正确地渲染组合的块网格。我也以相同的顺序渲染了所有需要的块,效果很好。

但是,当我需要在这些网格块“内部”添加其他对象时,绘图问题就开始了。例如,移动的播放器也只是具有透明纹理的四边形。我需要能够将他放在该大块网格中,也许是在他在墙前和窗后的瓷砖上。如果我要在块之前渲染播放器,它的透明像素将不会显示块网格。如果我要在块之后渲染播放器,则无法通过块中的透明四边形看到播放器。如果这可以轻松解决并且在CPU / GPU上不花钱,那将是我的问题的解决方案。但是我考虑自己是OpenGL的新手,所以我不太了解它的魔力。

我可以想到一个不涉及OpenGL的视图解决方案:

  • 转储大块网格方法,然后向前绘制。我要么需要一种更有效的绘图方式,要么不允许缩小太多以减少绘图调用,因为这是一个瓶颈。
  • 摆脱透明的四边形,使它们成为完整的3D。我认为这应该是设计选择,而不是强制性的事情,除了会为创建所有这些资产增加很多额外的工作。现在,我只是将纹理投影到了四边形上,而不是完全UV的具有个别纹理的模型。
  • 以适当的顺序在块之后绘制所有透明对象。这感觉有点容易出错,因为有些对象需要进入该块网格,而有些则不需要。
  • 仅将地板组合成批网格。楼层是最大的瓶颈,地图的底部填充了所有的地砖,单独绘制时大约有4000个绘制调用,一栋大型建筑物在每个Z层上也占用大量的地板。墙壁和物体的绘制少得多,一路缩小可能只有几百个最大值。因此,对于每个块,在一次调用中绘制所有楼层,然后对每个对象进行绘制,我将通过仅组合楼层来大量减少绘制调用。在绘制墙和对象时,我必须检查是否有潜在的动态对象要渲染,或者只检查块中是否有动态对象,并在绘制它们之前将所有墙和对象与它们进行排序。

这是我目前的渲染方式。

    Gdx.gl.glEnable(GL20.GL_DEPTH_TEST);
    Gdx.gl.glEnable(GL20.GL_BLEND);
    Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);

    shader.begin();
    shader.setUniformMatrix("u_worldView", cam.combined);

    // If I draw the player before the chunk the transparency of the player would not render the chunk.
    player.getMesh().render(shader, GL20.GL_TRIANGLES);

    // Drawing the mesh chunk combines of floors, walls and objects of each tile within the chunk.
    chunk.getCombinedMesh().render(shader, GL20.GL_TRIANGLES);


    // If I draw the player after the chunk the player would not be drawn if it is behind a transparent mesh like a window or a tree.
    player.getMesh().render(shader, GL20.GL_TRIANGLES);     
    shader.end();

那么我在这里有什么选择?我可以使用OpenGL帽子中的一些魔术来解决此问题吗?还是您还有其他建议要列入上面的清单?我正在为我的项目使用LibGDX。

0 个答案:

没有答案