有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在块中绘制等轴测图?

我想减少等轴测贴图实现中的绘制调用,所以我考虑组合多个网格,一次性绘制它们。我目前正在从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) 个答案