Сделал свой ландшафт, при текстурировании проблемы с мипмапом.
Подскажите, как решается. Если делать рамку вокруг тайла в текстуре, то какого размера и как код изменится? Мб генераторы есть готовые? Или какие-то решения из кода.
Я пытался брать кусок атласа с локальным отступом от края тайла, чтобы не затрагивать пикселей соседних тайлов в текстуре. Например, в своем шейдере я сначала высчитываю нужный тексель, как будто работаю с обычной текстурой, а потом отдаю в метод, который приведет координаты в соответствии с положением тайла в атласе. Я пробовал на целой текстуре считать отступ от края таким образом:
float2 UvOffset = float2(0.5 - ((0.5 - uv.x) * 0.9) , 0.5 - ((0.5 - uv.y) * 0.9)); - это для целой текстуры отступ, после чего результат с учетом количества текстур в атласе уже пересчитывается для нужного участка.
По задумке отступ от краев должен получится одинаковый, но кажется я что-то перепутал походу)
Может, стоит атлас на texture array заменить. Вместо тайла слой, никакого пересечения при миммаппинге.
maewyn
Чем больше хочешь мипов, тем больше будет бордюр у нулевого мипа (самого большого мипа).
| Number of mips | Anisotropy 1x/2x | Anisotropy 4x | Anisotropy 8x | Anisotropy 16x |
| 1 | 1 px | 2 px | 4 px | 8 px |
| 2 | 2 px | 4 px | 8 px | 16 px |
| 3 | 4 px | 8 px | 16 px | 32 px |
| 4 | 8 px | 16 px | 32 px | 64 px |
| 5 | 16 px | 32 px | 64 px | 128 px |
| 6 | 32 px | 64 px | 128 px | 256 px |
| 7 | 64 px | 128 px | 256 px | 512 px |
| 8 | 128 px | 256 px | 512 px | 1024 px |
| 9 | 256 px | 512 px | 1024 px | 2048 px |
| 10 | 512 px | 1024 px | 2048 px | 4096 px |
Бордюр это с одного края. То есть для Анизо 4х и 5 мипов будет 32 пикселя с каждого края, то есть отберётся полезного пространства 64 пикселя по горизонтали и 64 пикселя по вертикали. Соответственно у мипа 1 уже бордюр будет 16 (32 два края) и т.д.
Если есть возможность юзать текстурные массивы - юзай обязательно и в топку атласы. С атласами много гемороя. Тебе придётся для реализации враппинга делать градиентные выборки, они не дешёвые.
maewyn
Чувак, как человек, который делал террейн-атласы, а в итоге переделывал на текстурные массивы,
говорю: не совершай ошибки, делай текстурные массивы сразу - кучу гемора сэкономишь
но...ведь...directX 9...))
самое главное забыл в первом посте, я в юнити все это делаю
в unity ведь для текстурных массивов требуется десятый?
maewyn
киллер фича-не юзай мипы
/me runs
А вот aniso x16 надо
maewyn
> в unity ведь для текстурных массивов требуется десятый?
Да, текстурные массивы есть только начиная с ДХ10.
Ну можно еще 3Д-текстуры, если хочется д3д9. Правда там придется слайсы дублировать, чтобы фильтрация не мешала.
Executor
> ДХ10.
А юнити под виндой не умеет в GL?
можно кол-во мипов уменьшить до 2-4, а для совсем дальних кусков делай отдельный атлас с уже уменьшенными текстурами в нем и данный атлас без мипмэпов.
Dimich
> А юнити под виндой не умеет в GL?
Не в курсе.
x
> Можно просто поставить поинт фильтрацию для выборки между слоями.
Нельзя.
x
Мипы перемешаются, да. Можно, еще partial mipchain сделать, чтоб не налезали.
Все равно без анизотропной фильтрации террейн будет выглядеть страшно, что так, что так.
Ну вот я перешел на текстурные массивы:
Выкладываю картинки для сравнения, по которым видно, что что-то не так...
это старое использование атласов без мипмапа, как видно нет никаких артефактов
это 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 как раз и отвечал за смещение текстур в атласе, так что полосы по идее должны быть по другой причине
maewyn
Как вычисляется type?
Тема в архиве.