我想减少对等轴测图实现的绘制调用,因此我考虑了将多个网格合并并一次性绘制的想法。我目前正在使用8x8“块”中的所有图块创建网格。这意味着包含地板,墙壁和物体的网格。这些地板,墙壁和物体只是沿着Y向上的规则轴放置的四边形。旋转的正交摄影机提供等轴测投影矩阵。大多数地板和墙壁以不透明的纹理填充整个四边形,但是有些和大多数对象具有alpha透明度,例如窗户,破碎的地板或椅子对象。我正在通过向其添加单个网格来构建“块”网格,我这样做是按照从前到后,从下到上绘制的顺序进行的,否则根本无法正确地渲染组合的块网格。我也以相同的顺序渲染了所有需要的块,效果很好。
但是,当我需要在这些网格块“内部”添加其他对象时,绘图问题就开始了。例如,移动的播放器也只是具有透明纹理的四边形。我需要能够将他放在该大块网格中,也许是在他在墙前和窗后的瓷砖上。如果我要在块之前渲染播放器,它的透明像素将不会显示块网格。如果我要在块之后渲染播放器,则无法通过块中的透明四边形看到播放器。如果这可以轻松解决并且在CPU / GPU上不花钱,那将是我的问题的解决方案。但是我考虑自己是OpenGL的新手,所以我不太了解它的魔力。
我可以想到一个不涉及OpenGL的视图解决方案:
这是我目前的渲染方式。
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。