вот если прибавлять к элементу массива тогда картинка выглядит нормализованной но по факту это тоже не так... короче баги отлавливаю пока не могу разобраться где косячу.
вот пример:
Скрытый текст:
Egoor писал(а):alexmarch, можно тогда тебя попросить привести кусочек кода из твоего скрипта, где подгружаются хаймапы и накладываются на террейн?
alexmarch писал(а):Эпилог:
И вот я ищу способ как соединить в юнити грамотно 5 и более масок текстур или
как создать в WM2 маски так что бы при выгрузке и соединении они по всем слоям имели бы, жирную, единицу!
alexmarch писал(а):Egoor писал(а):alexmarch, можно тогда тебя попросить привести кусочек кода из твоего скрипта, где подгружаются хаймапы и накладываются на террейн?
Я уже говорил не однократно что работаю над этим и пока не реализовал то что задумал, поэтому и пачкую тут форум своими высказываниями, но если так хочется вот пожалуйстаСинтаксис:Используется csharp//Применяем полученый SplatMap на терейн дату
private void LoadSplats(string xvalue, string yvalue, ref TerrainData tdata)
{
if (_splats.Count > 0)
{
float[, ,] splatarray = new float[(int)_heightmapsize.x, (int)_heightmapsize.y, _splats.Count];
SplatPrototype[] prototypes = new SplatPrototype[_splats.Count];
for (int k = 0; k < _splats.Count; k++)
{
LoadSplat(_splats[k], k, xvalue, yvalue, ref prototypes, ref splatarray);
// Прогресс бар (тормазим работу <img src="./images/smilies/1.gif" alt=":)" title="Happy" />
EditorUtility.DisplayProgressBar("Importing Splat", ((k + 1)).ToString() + " Splat Files", 1);
if (_splats.Count - k == 1)
{
/*
* Идея alexz
* http://www.unity3d.ru/distribution/view ... a&start=30
* 46.- А у меня друг сломал сервер за пять минут!!!
* - Он что, хакер???
* - Нет. Он - мудак!!!
*/
// Нормализум то что не нормализованно
// Нормализация (normalization) — приведение к единичному размеру.
// Термин «Normalization» также переводится как «Нормировка», смысл которой сосотоит в приведении чего-либо к эталонному,
// единичному виду. Например, отнормировать последовательность означает умножит ее члены на такую величину,
// чтобы максимум (по модулю) этой последовательности стал равен единице.
if (_optionSplatMix)
{
for (int y = 0; y < _heightmapsize.y; y++)
{
for (int x = 0; x < _heightmapsize.x; x++)
{
float tsum = 0;
// Наберм слои в массив
for (int layer = 0; layer < _splats.Count; layer++)
{
tsum += splatarray[x, y, layer]; // запишим сумму весов всех слоев
}
for (int layer = 0; layer < _splats.Count; layer++)
{
if (tsum == 0)
{
Debug.LogError(
string.Format(
"Запись внутри цыкла ДО записи:, коэффициент: ({0}) всего слоев: ({1}) сумма весов слоев: ({2}) № слоя ({3}), вес слоя ({4})",
1/tsum, _splats.Count, tsum, layer, splatarray[x, y, layer]));
}
if (tsum > 1.000000001f) // короче если больше 1 нормализум
{
splatarray[x, y, layer] *= 1/tsum;
}
else if (tsum == 0 || tsum < 0.000000000001f) // если равняеться нулю
{
splatarray[x, y, layer] += 1/_splats.Count;
}
if (x == 1 && y == 0)
{
//Debug.LogError(string.Format("Запись внутри цыкла ПОСЛЕ записи:, коэффициент: ({0}) всего слоев: ({1}) сумма весов слоев: ({2}) № слоя ({3}), вес слоя ({4})", 1 / tsum, _splats.Count, tsum, layer, splatarray[x, y, layer]));
}
//splatarray[x, y, layer] += (1 - tsum)/_splats.Count; // Вычисляем среднее значение и прибовляем к каждому слою
}
}
}
// К удалению чисто проверка, весь ЭТОТ БЛОК УДАЛИТЬ!!!!
int asd = 1;
for (int y = 0; y < _heightmapsize.y; y++)
{
for (int x = 0; x < _heightmapsize.x; x++)
{
float tsum = 0;
// Наберм слои в массив
for (int layer = 0; layer < _splats.Count; layer++)
{
tsum += splatarray[x, y, layer]; // запишим сумму весов всех слоев
}
if (tsum > 1.1 && asd == 1)
{
asd = 2;
Debug.LogError(
string.Format(
"splatarray >1, коэффициент: ({0}) всего слоев: ({1}) сумма весов этих слоев: ({2}) x: ({8}) y: ({9})" +
"слой 1: ({3}) слой 2: ({4}) слой 3:({5}) слой 4: ({6}) слой 5: ({7}) ",
1/tsum, _splats.Count, tsum, splatarray[x, y, 0], splatarray[x, y, 1],
splatarray[x, y, 2], splatarray[x, y, 3], splatarray[x, y, 4], x, y));
}
}
}
//УДАЛИТЬ!!!!
}
}
//конец блока нормализации
}
tdata.splatPrototypes = prototypes;
tdata.SetAlphamaps(0, 0, splatarray);
prototypes = null;
splatarray = null;
System.GC.Collect(0);
}
}
//Загружаем файлы SplatMap-a в массив
private void LoadSplat(SplatMapInfo2 splat, int k, string xvalue, string yvalue, ref SplatPrototype[] prototypes, ref float[,,] splatarray)
{
// Load splatmap file
string splatfile = string.Format(splat.Filemask, xvalue, yvalue); //Get Name Files, x and y size
string[] splatfiles = System.IO.Directory.GetFiles(_imagesPath, splatfile + ".*"); // масив файлов
byte[] imagebytes = System.IO.File.ReadAllBytes(splatfiles[0]); // чтение из сплайта по байтам
Texture2D t = new Texture2D(1, 1); // создадим пустой обект t
t.LoadImage(imagebytes); // загрузим в t массив байтов сплайта
imagebytes = null; //чистим память
System.GC.Collect(0);// чистим
Color[] imagecolors = t.GetPixels();// передадми дату в масив imagecolors
int imagewidth = t.width;
DestroyImmediate(t); // укакошим t
for (int v = 0; v < _heightmapsize.y; v++) // будем крутить пока Y _heightmapsize не закончится
{
for (int u = 0; u < _heightmapsize.x; u++) // крутим _heightmapsize по X
{
splatarray[u, v, k] = imagecolors[((imagewidth - 1) - u)*imagewidth + v].r; // загрузим
}
}
imagecolors = null;
System.GC.Collect(0);
// Set splat prototype for this splat layer
SplatPrototype prototype = new SplatPrototype();
prototype.texture = splat.Texture;
prototype.tileOffset = new Vector2(splat.TileOffsetX, splat.TileOffsetY);
prototype.tileSize = new Vector2(splat.TileSizeX, splat.TileSizeY);
prototypes[k] = prototype;
}
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3