Войти
ПрограммированиеФорумГрафика

mipmap для атласа ландшафта

Страницы: 1 2 Следующая »
#0
23:34, 22 июня 2016

Сделал свой ландшафт, при текстурировании проблемы с мипмапом.

+ Показать

Подскажите, как решается. Если делать рамку вокруг тайла в текстуре, то какого размера и как код изменится? Мб генераторы есть готовые? Или какие-то решения из кода.
Я пытался брать кусок атласа с локальным отступом от края тайла, чтобы не затрагивать пикселей соседних тайлов в текстуре. Например, в своем шейдере я сначала высчитываю нужный тексель, как будто работаю с обычной текстурой, а потом отдаю в метод, который приведет координаты в соответствии с положением тайла в атласе. Я пробовал на целой текстуре считать отступ от края таким образом:
float2 UvOffset = float2(0.5 - ((0.5 - uv.x) * 0.9) , 0.5 - ((0.5 - uv.y) * 0.9)); - это для целой текстуры отступ, после чего результат с учетом количества текстур в атласе уже пересчитывается для нужного участка.
По задумке отступ от краев должен получится одинаковый, но кажется я что-то перепутал походу)


#1
10:19, 23 июня 2016

Может, стоит атлас на texture array заменить. Вместо тайла слой, никакого пересечения при миммаппинге.

#2
10:50, 23 июня 2016

maewyn
Чем больше хочешь мипов, тем больше будет бордюр у нулевого мипа (самого большого мипа).

Number of mips          Anisotropy 1x/2x          Anisotropy 4x          Anisotropy 8x          Anisotropy 16x         
11 px2 px4 px8 px
22 px4 px8 px16 px
34 px8 px16 px32 px
48 px16 px32 px64 px
516 px32 px64 px128 px
632 px64 px128 px256 px
764 px128 px256 px512 px
8128 px256 px512 px1024 px
9256 px512 px1024 px2048 px
10512 px1024 px2048 px4096 px

Бордюр это с одного края. То есть для Анизо 4х и 5 мипов будет 32 пикселя с каждого края, то есть отберётся полезного пространства 64 пикселя по горизонтали и 64 пикселя по вертикали. Соответственно у мипа 1 уже бордюр будет 16 (32 два края) и т.д.
Если есть возможность юзать текстурные массивы - юзай обязательно и в топку атласы. С атласами много гемороя. Тебе придётся для реализации враппинга делать градиентные выборки, они не дешёвые.

#3
13:19, 23 июня 2016

maewyn
Чувак, как человек, который делал террейн-атласы, а в итоге переделывал на текстурные массивы,
говорю: не совершай ошибки, делай текстурные массивы сразу - кучу гемора сэкономишь

#4
18:30, 23 июня 2016

но...ведь...directX 9...))
самое главное забыл в первом посте, я в юнити все это делаю
в unity ведь для  текстурных массивов требуется десятый?

#5
21:35, 23 июня 2016

maewyn
киллер фича-не юзай мипы
/me runs
А вот aniso x16 надо

#6
21:29, 24 июня 2016

maewyn
> в unity ведь для  текстурных массивов требуется десятый?

Да, текстурные массивы есть только начиная с ДХ10.

#7
7:53, 25 июня 2016

Ну можно еще 3Д-текстуры, если хочется д3д9. Правда там придется слайсы дублировать, чтобы фильтрация не мешала.

#8
8:38, 25 июня 2016

Executor
> ДХ10.
А юнити под виндой не умеет в GL?

#9
11:51, 25 июня 2016

можно кол-во мипов уменьшить до 2-4, а для совсем дальних кусков делай отдельный атлас с уже уменьшенными текстурами в нем и данный атлас без мипмэпов.

#10
12:42, 25 июня 2016

Dimich
> А юнити под виндой не умеет в GL?

Не в курсе.

#11
1:49, 26 июня 2016

x
> Можно просто поставить поинт фильтрацию для выборки между слоями.
Нельзя.

#12
2:50, 27 июня 2016

x
Мипы перемешаются, да. Можно, еще partial mipchain сделать, чтоб не налезали.
Все равно без анизотропной фильтрации террейн будет выглядеть страшно, что так, что так.

#13
14:19, 20 июля 2016

Ну вот я перешел на текстурные массивы:

Выкладываю картинки для сравнения, по которым видно, что что-то не так...

это старое использование атласов без мипмапа, как видно нет никаких артефактов

+ Показать

это Texture2DArray с автоматически сгенерированными мипами.

+ Показать

а это тот же Texture2DArray, только я взял мип побольше уровнем, чтобы в глаза бросались полоски + свойства массива в инспекторе

+ Показать
+ Показать

маски смешивания текстур для наглядности сделал квадратными...

В surface шейдере у меня есть 2 строки, которые показывают как я вытаскиваю данные из текстуры/массива

1. float4 result_tex = tex2D(_Atlas, UVmultiplayer(type, uvoffset)).rgba; //если это раскомментировано - используется атлас

2. float3 uvForLanArr = float3(uvoffset.x, uvoffset.y, type);
float4 result_tex = UNITY_SAMPLE_TEX2DARRAY(_LandArr, uvForLanArr);  //если это раскомментировано - используется массив

Собственно UVMultiplyer как раз и отвечал за смещение текстур в атласе, так что полосы по идее должны быть по другой причине

#14
16:31, 20 июля 2016

maewyn
Как вычисляется type?

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.