细分二十面体hex/ Pent网格高效渲染?

如何在细分的二十面体上显示hex/五边形网格?

我有一个细分的二十面体星球作为战略游戏的“板子”。 根据用户input到地图生成器的大小,它通常具有几千到几十万个瓦片之间的任何地方。

基本上,我不能蛮力这样做,并做一个简单的边界和深度检查,因为瓷砖的数量。

为了简单起见,我将网格存储在二维数组中。 我明白,在2D地图上,只需执行如下操作即可绘制hex地图:

for(int x = cameraX; x < viewportWidth; x++) { for(int y = cameraY; y < viewportHeight; y++) { if(x % 2 == 0) //For the 2D array to work properly we have to offset every other row by +1 world coordinate (assuming each tile is 1*1 world coordinates) grid[x][y].render(x+tile_width, y); else grid[x][y].render(x, y); } } 

而要绘制一个环绕的世界,您将检查相机位置的绝对距离。

例如:

 //This sets up the variable that tells the game what hex tiles to draw. if(camera.x - viewportWidth < 0) { camera_rX = camera.x - viewportWidth; cameraX = grid.length + camera_rX; //We will add this to the cameraX value because the result should be a negative value if the prerequisite if statement is met. The "cameraX" variable is used for viewing calculations, while the "camera.x" variable is used for camera positioning. Err... I think this makes sense. } 

首先想到的问题是:在游戏过程中,hex星球的变化很大吗? 如果这个星球大部分是静止的,而且它的居民只是移动了很多,我肯定不会分开渲染这些瓷砖。

我自己做了一个hex的游戏 。 而在这个游戏中,这个星球只是两个平局,一个是画脸,一个画边缘。

这样我就不必迭代tile来渲染它们。

对于顶层的东西(树木,岩石等),我使用了实例化渲染,所以在一个drawcall中,所有的松树都是一次渲染的。 我不确定你在渲染中使用什么(问题标签没有提到渲染系统),但是如果是OpenGL或者OpenGLES3,那么请看glVertexAttribDivisor()glDrawArraysInstanced()

如果游戏过程中瓷砖发生了很大的变化,那么就会变得棘手。 比方说,你经常改变世界瓷砖的颜色。 然后,我仍然会有一个VBO来表示整个星球,并且在渲染之前用正确的颜色每帧更新VBO,如上所述。