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。
解决方案
推荐阅读
- ios - SwiftUI View scrollTo 第二次呈现的行为不同
- node.js - 使用 OAuth 时 Google 日历“请求缺少有效的 API 密钥”
- ios - 尝试使用委托来共享来自自定义 tableViewCell 的文本输入并且数据未共享
- php - 如何在 woocommerce 结帐页面中禁用字段
- android - BLE和Android:使用设备公共地址进行直接连接
- python - 如何将此 python 数据转换为 JSON
- java - 我们如何在 LinkedList 中获取元素索引正如所说的那样,它是随机存储的
- android - 如何为 otp 添加自动填充建议
- java - Reactor - 在处理错误的情况下延迟通量元素
- c - 仅与多个子进程之一共享内存?