Language agnostic 大面积纹理?

Language agnostic 大面积纹理?,language-agnostic,textures,Language Agnostic,Textures,这是一个与特定语言无关的非常普遍的问题。我有一个int的数组: int[100][100] map; 这只包含平铺编号,并渲染为256x256平铺。所以它基本上只是一个平铺图或者其他任何它应该被称为的东西。问题是我想在地图上写任何东西,任何地方,它应该留在那里。例如,可以在地面上的东西(如草、花、石头和其他东西)上绘画,从而使地形更加多样化,而无需每次渲染这些精灵大量次。但是,让每个磁贴都包含自己的纹理来写入将非常消耗内存,因为要存储256x256x100x100=655360000像素。这不

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

int[100][100] map;
这只包含平铺编号,并渲染为256x256平铺。所以它基本上只是一个平铺图或者其他任何它应该被称为的东西。问题是我想在地图上写任何东西,任何地方,它应该留在那里。例如,可以在地面上的东西(如草、花、石头和其他东西)上绘画,从而使地形更加多样化,而无需每次渲染这些精灵大量次。但是,让每个磁贴都包含自己的纹理来写入将非常消耗内存,因为要存储256x256x100x100=655360000像素。这不就是千兆字节的数据吗

有谁知道一个好的苏洛蒂安将军能在不破坏太多记忆的情况下完成我的任务吗

如果有人怀疑我用C++和HGE(HAF的游戏引擎)。< /P> 编辑:我已选择限制屏幕上的内容量,以便它可以渲染。但看看这里,也许你会明白我想要实现的目标:


您必须使用alpha贴图

您将绘制一个纹理256x256,用于映射整个地形。对于每个通道r、g、b、a,您将使用另一个纹理平铺地形

r=sand.jpg g=grass.jpg b=水.jpg a=土壤.jpg

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

我现在正在做这样的事情,我就是这样做的


您必须使用alpha贴图

您将绘制一个纹理256x256,用于映射整个地形。对于每个通道r、g、b、a,您将使用另一个纹理平铺地形

r=sand.jpg g=grass.jpg b=水.jpg a=土壤.jpg

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

我现在正在做这样的事情,我就是这样做的


如果它只是基于瓷砖,那么您只存储每个独特瓷砖和每个独特“覆盖”(花卉、岩石等)的一个实例。您可以像以前一样通过id或内存位置引用它

您只需存储一个位置(瓷砖编号和瓷砖上的位置)和对覆盖层的引用即可“绘制”它,而无需消耗大量内存


另外,我相信您知道这一点,但您只渲染屏幕上的内容。因此,一旦所有内容都加载完毕,内存使用就基本保持不变。

如果它只是基于磁贴,那么您只存储每个独特磁贴和每个独特“覆盖”(花卉、岩石等)的一个实例。您可以像以前一样通过id或内存位置引用它

您只需存储一个位置(瓷砖编号和瓷砖上的位置)和对覆盖层的引用即可“绘制”它,而无需消耗大量内存


另外,我相信您知道这一点,但您只渲染屏幕上的内容。因此,一旦所有内容都加载完毕,内存使用就基本保持不变。

我不太确定您想做什么,但您可能应该将磁贴放在单独的层中。因此,假设对于每个“瓷砖”,您都有一个由下而上排列的纹理列表,您可以将其混合在一起,这样您就只存储瓷砖索引。

我不太确定您要做什么,但您可能应该将瓷砖放在单独的层中。因此,假设对于每个“平铺”,您有一个由下而上排列的纹理列表,您可以将其混合在一起,这样您就只存储平铺索引。

除了存储平铺编号,还存储叠加编号和偏移位置

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);
    }
}
intx,y;
对于(y=0;y<100;++y){
对于(x=0;x<100;++x){
渲染平铺(贴图[y][x]。平铺)
渲染叠加(贴图[y][x]。叠加,贴图[y][x]。叠加偏移量,贴图[y][x]。叠加偏移量;
}
}

可以说,将叠加和偏移存储在与平铺分开的阵列中会更快,但让地图上的每个区域都像这样独立起来更容易理解。

与其只存储平铺编号,还可以存储叠加编号和偏移位置

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);
    }
}
intx,y;
对于(y=0;y<100;++y){
对于(x=0;x<100;++x){
渲染平铺(贴图[y][x]。平铺)
渲染叠加(贴图[y][x]。叠加,贴图[y][x]。叠加偏移量,贴图[y][x]。叠加偏移量;
}
}

可以说,将叠加和偏移存储在与瓷砖分开的阵列中速度更快,但让地图上的每个区域都像这样独立起来更容易理解。

我应该提到,这一点的主要目的是,我需要能够实时渲染它,以便能够在地面上有成千上万的对象。游戏应该是一个自上而下的僵尸射击游戏,这意味着将大量的血液、炮弹和尸体等渲染到地面。所有僵尸和粒子的人工智能计算和渲染非常繁重,因为它们太多了,我试图创造一个非常大的“生活”世界,你拍摄的所有东西都留在那里。我应该提到,这的主要目的是我需要能够实时渲染它,能够在地面上有成千上万的物体。游戏应该是一个自上而下的僵尸射击游戏,这意味着将大量的血液、炮弹和尸体等渲染到地面。所有僵尸和粒子的人工智能计算和渲染都非常繁重,因为它们太多了,我正试图创建一个非常大的“生活”世界,让你拍摄的所有东西都留在那里。你的意思是,如果我已经绘制了纹理,就只存储实际纹理,否则就引用空白纹理?这可能是一个选项,我猜:)是的,我知道我只渲染屏幕上的内容,所以我设置了for循环,通过将在屏幕上渲染的元素来渲染主瓷砖top-only循环。这感觉比循环整个阵列并逐个检查更快。你将存储每个独特纹理的一个副本和每个独特“地面碎片”的一个副本。