Страница 1 из 1

Мипмапы в шейдере? Текстуры, атласы и артефакты.

СообщениеДобавлено: 12 фев 2016, 18:24
SARJ
Можно ли отключить у текстур мипмапы, а в шейдерах генерировать уже нужные данные в зависимости от расстояния до игрока? Потому что текстуру надо сделать Point, без всяких билинейных и трилинейных фильраций, а то она размывается.

Re: Мипмапы в шейдере?

СообщениеДобавлено: 12 фев 2016, 18:41
DbIMok
SARJ писал(а):Можно ли отключить у текстур мипмапы

да, в настройках импорта
SARJ писал(а):в шейдерах генерировать уже нужные данные в зависимости от расстояния до игрока

да, в зависимости от _WorldSpaceCameraPos

Re: Мипмапы в шейдере?

СообщениеДобавлено: 13 фев 2016, 11:57
SARJ
DbIMok писал(а):
SARJ писал(а):Можно ли отключить у текстур мипмапы

да, в настройках импорта
SARJ писал(а):в шейдерах генерировать уже нужные данные в зависимости от расстояния до игрока

да, в зависимости от _WorldSpaceCameraPos

Это то понятно... А как генерировать мипмапы непосредственно в шейдере? Каким образом они используются? Что-то в гугле почти нет инфы по этому вопросу.

Re: Мипмапы в шейдере?

СообщениеДобавлено: 13 фев 2016, 12:03
waruiyume
http://http.developer.nvidia.com/GPUGem ... ter20.html
Сам не читал, но вроде что-то похожее.

Re: Мипмапы в шейдере?

СообщениеДобавлено: 13 фев 2016, 13:05
DbIMok
SARJ писал(а):а то она размывается

видимо лучше показать на картинках, что вы имеете в виду. насчет своих mipmap - можно использовать .dds со своими подготовленными или в Postprocess при импорте менять через http://docs.unity3d.com/ScriptReference ... ixels.html для каждого из уровней мипмапа. но судя по вашим вопросам, ничего путевого из этого не выйдет. вот есть у вас 4 пикселя, мипмап делает из них один усредняя и соответственно "размывая". как вы собираетесь проделать то же самое лучше?

Re: Мипмапы в шейдере?

СообщениеДобавлено: 13 фев 2016, 14:59
SARJ
DbIMok писал(а):
SARJ писал(а):а то она размывается

видимо лучше показать на картинках, что вы имеете в виду. насчет своих mipmap - можно использовать .dds со своими подготовленными или в Postprocess при импорте менять через http://docs.unity3d.com/ScriptReference ... ixels.html для каждого из уровней мипмапа. но судя по вашим вопросам, ничего путевого из этого не выйдет. вот есть у вас 4 пикселя, мипмап делает из них один усредняя и соответственно "размывая". как вы собираетесь проделать то же самое лучше?

Итак, попытаюсь целиком описать задачу.

Если коротко, но нужно формировать карту как в майнкрафте, там это реализовано отдельными текстурами 16х16 (т.е. никаких атласов), с мипмапами и т.п. Количество текстур таких на карте несколько сотен (300-500).

А теперь подробно вся суть...

Подразумевается использование в шейдере CGPROGRAM vert+frag.

Использование текстур 16х16 в режиме Point без мипмапов дает такой результат

minmap1.png


Если мипмапы включить, то мы видим такую лесенку резких переходов (по сути переходов и нет) между уровнями мипмапов

minmap2.png
lines.png


Это можно исправить, если установить вместо режима Point поставить Bilinear, но тогда текстуры размываются.

minmap4.png


Опять же решение есть, если установить размер текстур в 256 или 512. Но в том же майнкрафте при 16х16 четкость луче чем с 512х512 в Юнити. Предположим что в майнкрафте просто в начале загрузки берется эта текстурка, приводится к размеру 512х512 (что делается запросто) и формируются текстуры с мипмапами.

Теперь надо как-то а шейдере использовать много текстур. Используется DX9 дабы была совместимость со слабыми карточками.
Предел для шейдера это 16 штук sampler2D. Поэтому надо искать другие решения.
Атласы зло! В режиме билинейной фильтрации текстур ужас что творится на расстоянии, все изза того, что при генерации мипмапов берется информация из соседних текстур атласа. Но опять же, всего 16 sampler2D, дже используя атлас 2048х2048 и текстуры 256х256 + продублировать бордеры по 128 по краям, получим 16 тестур на атлас, 16х16 = 256. Все, предел 256 текстур, и помяти куча расходуется. Но этот вариант я оставил на самый последний безвыходный момент.

В режиме Point c мипмапами вроде как эта проблема не наблюдается, скрина нет к сожалению.
Но присутствует проблема с уровнями мипмапов, опять посмотрите на 2 скрин с лесенкой из мипмапов.
С атласами без мипмапов вообще глаза вылезут

minmap5.png


Идея была такой...
Раз в шейдер нельзя поместить больше 16 sampler2D, то поместить сразу в код шейдера информацию от текстурах в массив например float4[200][16][16]. Это к примеру, в реальности можно сжать данные, потом распаковывать в ходе работы шейдера для экономии памяти. Обратите внимание, что текстуры размером больше 16х16 уже проблематично будет использовать.
Второй момент, это то, что у текстуры формируемой из массива, мипмапов попросту нет. Их надо генерировать в шейдере. И насчет билинейной фильтрации еще даже не знаю как правильно реализовать в таком случае.
Почему нужны были уровни мипмапов, потому что я думал установить одну главную текстуру, и уже в ходе работы шейдера подменять ее значения на свои. Т.к. для нее будут изначально сформированы мипмапы, то достаточно определить какой уровень используется. Мипмапы придется заранее подготовить, и также запаковать, и поместить в массивы меньшего размера. В итоге получим в шейдере что-то типа того...
float4[200][16][16];
float4[200][8][8];
float4[200][4][4];
float4[200][2][2];
float4[200][1][1];

Что еще сделать я не знаю. Давайте получаем вместе как реализовать это. Атласы (мультитекстура) самый крайний вариант, виду того, что захватываются пиксели с соседних текстур. Идеальный вариант был бы использования отдельных png текстур 16х16, или же 256-512 если не получится с 16х16.

Какие есть мысли у кого?

Re: Мипмапы в шейдере?

СообщениеДобавлено: 13 фев 2016, 15:19
DbIMok
по этим граблям уже потоптались. например. в том топике эта тема не раз поднималась. насчет мипов и атласов http://forum.unity3d.com/threads/mip-ma ... as.353222/ и дальше по ссылкам.

Re: Мипмапы в шейдере?

СообщениеДобавлено: 13 фев 2016, 15:40
SARJ
DbIMok писал(а):по этим граблям уже потоптались. например. в том топике эта тема не раз поднималась. насчет мипов и атласов http://forum.unity3d.com/threads/mip-ma ... as.353222/ и дальше по ссылкам.

Спасибо. Буду читать сейчас. Но можно хотя бы вкратце как мне дальше быть, какой придерживаться стратегии?

Вот кстати сейчас такая графика у меня получается...
mainhouse.JPG

Re: Мипмапы в шейдере?

СообщениеДобавлено: 13 фев 2016, 18:43
SARJ
Стоило сделать Атласом с 16 текстурами 256х256 + 128 затайлена каждая текстура по краям той же самой текстурой (итого 2048х2048). Это капец какой то :(( :(( :(( Че ж за такая юнити.... Я все какие можно параметры пробовал, какой смысл тогда вообще в этих атласах если они такое г... делают.....
minmap6.png

Re: Мипмапы в шейдере? Текстуры, атласы и артефакты.

СообщениеДобавлено: 13 фев 2016, 19:28
Woolf
Предположим что в майнкрафте просто в начале загрузки берется эта текстурка, приводится к размеру 512х512

Ничего в майнкрафте не берется. Там вообще нет мипмапов, их докручивают спецмально с помощью плагинов.

Че ж за такая юнити..

При чем тут юнити, если руки кривые? Если вы хотите сделать мипмапы для атласа, то нужно уменьшать каждый фрагмент атласа отдельно, а затем заново склеивать, чтобы элементы атласа не размывались между собой. А вы что делали, то и получили. Вы хотели получить картинку, как в MC? Вы её получили на первом скриншоте "в режиме Point без мипмапов". А дальже сглаживайте постпроцессом, как и сделано в MC.

Re: Мипмапы в шейдере? Текстуры, атласы и артефакты.

СообщениеДобавлено: 13 фев 2016, 21:19
SARJ
Woolf писал(а):При чем тут юнити, если руки кривые?

Руки не кривые, это скорее недостаток информации... Сижу один разбираюсь со всем, даже спросить совета не у кого...

Woolf писал(а):Если вы хотите сделать мипмапы для атласа, то нужно уменьшать каждый фрагмент атласа отдельно, а затем заново склеивать, чтобы элементы атласа не размывались между собой.

Как их склеить?

Woolf писал(а):Ничего в майнкрафте не берется. Там вообще нет мипмапов, их докручивают спецмально с помощью плагинов. А вы что делали, то и получили. Вы хотели получить картинку, как в MC? Вы её получили на первом скриншоте "в режиме Point без мипмапов". А дальже сглаживайте постпроцессом, как и сделано в MC.

Постпроцесс - в шейдере? Что хоть делать то там надо?

Re: Мипмапы в шейдере? Текстуры, атласы и артефакты.

СообщениеДобавлено: 13 фев 2016, 22:06
SARJ
Вот такой у меня атлас (PNG ARGB 32bit 2048x2048)
TexAtlas.jpg

Причем текстура берется из квадратиков (схематично нарисованы) обозначенных красным.
Смотрите какие поля вокруг оставлены, и все равно выглядит не так как надо.

Re: Мипмапы в шейдере? Текстуры, атласы и артефакты.

СообщениеДобавлено: 14 фев 2016, 00:50
SARJ
Нарисовал файл с мимпамами, упаковал
minmap7.png

Картина не изменилась, те же артефакты в дали. UV назначены как писал в начале, с запасом аж по пол текстуры по краям.

Re: Мипмапы в шейдере? Текстуры, атласы и артефакты.

СообщениеДобавлено: 14 фев 2016, 17:23
SARJ
Плюс к этому всему вставляет "свои 5 копеек" еще и анизотропная фильтрация
https://en.wikipedia.org/wiki/Anisotropic_filtering
256px-MipMap_Example_STS101_Anisotropic.png

Если обычные мипмапы вручную для атласа еще можно нарисовать, то для анизотропной фильтрации - нет.

Вторая проблема то что атлас это несколько текстур, а последние мимап уровни это каша из пикселей, а самый последний пиксель - это вообще один пиксель! (на весь атлас!)
Что собственно продемонстрировано тут http://answers.unity3d.com/questions/24 ... -a-ge.html