Я работаю над инструментом генерации планет в C ++ и в настоящее время пытаюсь сгенерировать текстуры и карты высот.
Я использую для этого функцию трехмерного перлианового шума, поэтому каждый раз, когда я генерируютекстура или карта высот Я вычислю значение функции шума для каждой вершины на поверхности сферы.
Эти координаты не меняются.Первоначально я вычислял их, отображая куб в сферу, используя этот метод .
Затем я хорошо подумал, если я знаю, что эти значения будут одинаковыми каждый раз, почему бы не рассчитать ихи вывести их в файл заголовка, где они могут быть определены как статические массивы.
Я хочу создать текстуры 512x512, это означает, что 260 000 + координаты генерируются для лица : (*
Полученные координаты были сохранены в массиве:
float textureMapSaved[6][512][512][3] = {etc};
Поскольку куб имеет 6 граней , 512x512 пикселей на грань и 3 соординаты (x, y & z) .
Можно надеяться, что это позволит мне затем пройти через массив, получая координату для значения функции перлианского шума, которая меня интересует.
До сих пор мне только удалось превратить мой компьютер в жуткий беспорядок.
Мой вопрос:
Есть ли жизнеспособный способ сделать это?
Без создания выходного файлаПрограмма занимает около 15 минут для вычисления сферы.На самом деле я не мог скомпилировать с заголовком, он разбил мой компьютер.
Затем я попробовал 256x256, и это сработало немного лучше, но мой компьютер все еще зависал;Я предполагаю, что это потому, что он не может эффективно выделить память для массива 4D.
Спасибо за быстрые ответы!
На данный момент я делаю следующее:
std::vector<std::vector<std::vector<std::vector<float>>>> textureFaces = GenerateSphereCoordinates(TEXTURE_MAP);
std::ofstream myfile;
myfile.open ("spheremapping.h");
myfile << "#ifndef _SPHEREMAP \n#define _SPHEREMAP \n\nfloat textureMapSaved[6][" << textureRes << "][" << textureRes << "][3] = {";
for(int i = 0; i < 6; i++)
{
myfile << "{";
for(int j = 0; j < textureRes; j++)
{
myfile << "{";
for(int k = 0; k < textureRes; k++)
{
if(k != textureRes - 1)
{
myfile << "{ " << textureFaces[i][j][k][0] << ", " << textureFaces[i][j][k][1] << ", " << textureFaces[i][j][k][2] << "}, " ;
}
else
{
myfile << "{ " << textureFaces[i][j][k][0] << ", " << textureFaces[i][j][k][1] << ", " << textureFaces[i][j][k][2] << "}" ;
}
}
if(j != textureRes - 1)
{
myfile << "}, \n";
}
else
{
myfile << "} \n";
}
}
if(i != 5)
{
myfile << "}, \n\n";
}
else
{
myfile << "} \n\n";
}
}
myfile << "};\n\n#endif";
myfile.close();
Как сохранить его в виде двоичного файла и прочитать его непосредственно в память?