巨大的区域纹理?

时间:2009-08-10 08:00:50

标签: language-agnostic textures

这是一个非常普遍的问题,与特定语言无关。我有这个int数组:

int[100][100] map;

这仅包含图块编号,并呈现为256x256图块。所以它基本上只是一个瓦片地图或任何应该调用的地图。事情是我希望能够在任何地方向地图写任何东西,它应该留在那里。例如,能够在地面上的东西上绘画,例如草,花,石头和其他东西,使地形变得更加多样化,而不必每次渲染这些精灵时都会渲染很多次。但是,使每个磁贴包含它自己的要写入的纹理将会非常耗费内存,因此要存储256x256x100x100 = 655360000像素。不会像千兆字节的数据或东西!?

有没有人知道在不杀死太多记忆的情况下做出我想要做的事情的一般情绪?

如果有人想知道我正在使用C ++和HGE(Haaf的游戏引擎)。

编辑:我选择限制屏幕上的内容数量,以便它可以呈现。但是看看这里,也许你会理解我试图实现的目标: Link to image because I'm not allowed to use image tags :(

4 个答案:

答案 0 :(得分:2)

如果它只是基于图块,那么您只存储每个唯一图块的一个实例和每个唯一的“叠加”(花,岩石等)。您可以像以前一样通过id或内存位置引用它。

您只需存储一个位置(图块上的图块编号和位置)以及对图层的引用即可“绘制”它,而不会占用大量内存。

另外,我相信你知道这一点,但你只能在屏幕上呈现内容。因此,一旦所有内容都被加载,内存使用量就会非常不变。

答案 1 :(得分:1)

我不确定你要做什么,但你应该把瓷砖放在不同的层中。所以说对于每个“瓷砖”,你有一个自下而上排列的纹理列表,你可以将它们混合在一起,这样你就只能存储瓷砖索引。

答案 2 :(得分:1)

不是仅存储图块编号,还要存储叠加编号和偏移位置。

struct map_zone {
    int tile; // tile number
    int overlay; // overlay number (flower, rock, etc). In most cases will be zero
    int overlay_offset_x; // draw overlay at X pixels across from left
    int overlay_offset_y; // draw overlay at Y pixels down from top
}

map_zone[100][100] map;

用于渲染:

int x, y;
for(y = 0; y < 100; ++y) {
    for(x = 0; x < 100; ++x) {
        render_tile(map[y][x].tile)
        render_overlay(map[y][x].overlay, map[y][x].overlay_offset_x, map[y][x].overlay_offset_y);
    }
}

将叠加层和偏移量存储在与图块不同的数组中可以说更快,但是让地图上的每个区域都像这样自包含更容易理解。

答案 3 :(得分:0)

你必须使用alpha贴图..

你要绘制一个纹理256x256,它可以映射你的整个地形。对于每个通道r,g,b,a,您将使用另一个纹理平铺地形..

r = sand.jpg g = grass.jpg b = water.jpg a = soil.jpg

在着色器中

,您将检查alpha贴图的颜色并使用这些纹理进行绘制..

我现在正在做这样的事情,我确实喜欢那样

alt text

alt text