Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 画一个等距图在块?_Java_Opengl_Libgdx_Drawing - Fatal编程技术网

Java 画一个等距图在块?

Java 画一个等距图在块?,java,opengl,libgdx,drawing,Java,Opengl,Libgdx,Drawing,我想减少等轴测贴图实现中的绘制调用,因此我考虑组合多个网格并一次性绘制它们。我目前正在从8x8“块”中的所有瓷砖创建网格。这意味着包含楼板、墙和对象的网格。这些楼板、墙和对象只是沿Y向上的规则轴放置的四边形。旋转正交摄影机提供等轴测投影矩阵。大多数地板和墙壁使用不透明纹理填充整个四边形,但也有一些,而且大多数对象具有alpha透明度,如窗户、破损地板或椅子对象。我通过添加单个网格来构建“块”网格,我这样做是为了从前到后、从下到上绘制,否则组合的块网格根本无法正确渲染。我以相同的顺序渲染所有需要的

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

但是,当我需要在这些网格块的“内部”添加其他对象时,绘图问题就开始了。例如,一个移动的播放器也是一个具有透明纹理的四边形。我需要能够把他放在那个大块的网格里,也许放在一块瓷砖上,他在墙前和窗后。如果我在区块之前渲染播放器,它的透明像素将不会显示区块网格。如果我在区块之后渲染播放器,那么播放器将无法通过区块中的透明四边形显示。如果这可以很容易地解决,并且在CPU/GPU上不太昂贵,那将是我问题的解决方案。然而,我认为自己是OpenGL新手,所以我不太清楚它的魔力

我可以想出一个视图解决方案来解决这个问题,它不涉及OpenGL:

  • 转储块网格方法并将其向后拉到前面。我要么需要一种更有效的绘图方法,要么不允许缩小太多以减少绘图调用,因为这是一个瓶颈
  • 去除具有透明度的四边形,并使其完全三维化。我觉得这应该是一个设计选择,而不是一个强制性的事情,除此之外,它将增加许多额外的工作,以创造所有这些资产。现在,我只是将纹理投影到四边形上,而不是使用单独纹理的完全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