Java 画一个等距图在块?
我想减少等轴测贴图实现中的绘制调用,因此我考虑组合多个网格并一次性绘制它们。我目前正在从8x8“块”中的所有瓷砖创建网格。这意味着包含楼板、墙和对象的网格。这些楼板、墙和对象只是沿Y向上的规则轴放置的四边形。旋转正交摄影机提供等轴测投影矩阵。大多数地板和墙壁使用不透明纹理填充整个四边形,但也有一些,而且大多数对象具有alpha透明度,如窗户、破损地板或椅子对象。我通过添加单个网格来构建“块”网格,我这样做是为了从前到后、从下到上绘制,否则组合的块网格根本无法正确渲染。我以相同的顺序渲染所有需要的块,这非常有效 但是,当我需要在这些网格块的“内部”添加其他对象时,绘图问题就开始了。例如,一个移动的播放器也是一个具有透明纹理的四边形。我需要能够把他放在那个大块的网格里,也许放在一块瓷砖上,他在墙前和窗后。如果我在区块之前渲染播放器,它的透明像素将不会显示区块网格。如果我在区块之后渲染播放器,那么播放器将无法通过区块中的透明四边形显示。如果这可以很容易地解决,并且在CPU/GPU上不太昂贵,那将是我问题的解决方案。然而,我认为自己是OpenGL新手,所以我不太清楚它的魔力 我可以想出一个视图解决方案来解决这个问题,它不涉及OpenGL:Java 画一个等距图在块?,java,opengl,libgdx,drawing,Java,Opengl,Libgdx,Drawing,我想减少等轴测贴图实现中的绘制调用,因此我考虑组合多个网格并一次性绘制它们。我目前正在从8x8“块”中的所有瓷砖创建网格。这意味着包含楼板、墙和对象的网格。这些楼板、墙和对象只是沿Y向上的规则轴放置的四边形。旋转正交摄影机提供等轴测投影矩阵。大多数地板和墙壁使用不透明纹理填充整个四边形,但也有一些,而且大多数对象具有alpha透明度,如窗户、破损地板或椅子对象。我通过添加单个网格来构建“块”网格,我这样做是为了从前到后、从下到上绘制,否则组合的块网格根本无法正确渲染。我以相同的顺序渲染所有需要的
- 转储块网格方法并将其向后拉到前面。我要么需要一种更有效的绘图方法,要么不允许缩小太多以减少绘图调用,因为这是一个瓶颈
- 去除具有透明度的四边形,并使其完全三维化。我觉得这应该是一个设计选择,而不是一个强制性的事情,除此之外,它将增加许多额外的工作,以创造所有这些资产。现在,我只是将纹理投影到四边形上,而不是使用单独纹理的完全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