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

Шейдеры и все-все-все.

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

Сообщение SARJ 12 фев 2016, 18:24

Можно ли отключить у текстур мипмапы, а в шейдерах генерировать уже нужные данные в зависимости от расстояния до игрока? Потому что текстуру надо сделать Point, без всяких билинейных и трилинейных фильраций, а то она размывается.
Последний раз редактировалось SARJ 13 фев 2016, 18:45, всего редактировалось 1 раз.
SARJ
UNIт
 
Сообщения: 61
Зарегистрирован: 14 июл 2014, 20:47
Откуда: Россия

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

Сообщение DbIMok 12 фев 2016, 18:41

SARJ писал(а):Можно ли отключить у текстур мипмапы

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

да, в зависимости от _WorldSpaceCameraPos
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.6k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

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

Сообщение SARJ 13 фев 2016, 11:57

DbIMok писал(а):
SARJ писал(а):Можно ли отключить у текстур мипмапы

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

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

Это то понятно... А как генерировать мипмапы непосредственно в шейдере? Каким образом они используются? Что-то в гугле почти нет инфы по этому вопросу.
SARJ
UNIт
 
Сообщения: 61
Зарегистрирован: 14 июл 2014, 20:47
Откуда: Россия

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

Сообщение waruiyume 13 фев 2016, 12:03

http://http.developer.nvidia.com/GPUGem ... ter20.html
Сам не читал, но вроде что-то похожее.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

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

Сообщение DbIMok 13 фев 2016, 13:05

SARJ писал(а):а то она размывается

видимо лучше показать на картинках, что вы имеете в виду. насчет своих mipmap - можно использовать .dds со своими подготовленными или в Postprocess при импорте менять через http://docs.unity3d.com/ScriptReference ... ixels.html для каждого из уровней мипмапа. но судя по вашим вопросам, ничего путевого из этого не выйдет. вот есть у вас 4 пикселя, мипмап делает из них один усредняя и соответственно "размывая". как вы собираетесь проделать то же самое лучше?
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.6k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

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

Сообщение SARJ 13 фев 2016, 14:59

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.

Какие есть мысли у кого?
У вас нет доступа для просмотра вложений в этом сообщении.
SARJ
UNIт
 
Сообщения: 61
Зарегистрирован: 14 июл 2014, 20:47
Откуда: Россия

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

Сообщение DbIMok 13 фев 2016, 15:19

по этим граблям уже потоптались. например. в том топике эта тема не раз поднималась. насчет мипов и атласов http://forum.unity3d.com/threads/mip-ma ... as.353222/ и дальше по ссылкам.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.6k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

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

Сообщение SARJ 13 фев 2016, 15:40

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

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

Вот кстати сейчас такая графика у меня получается...
mainhouse.JPG
У вас нет доступа для просмотра вложений в этом сообщении.
SARJ
UNIт
 
Сообщения: 61
Зарегистрирован: 14 июл 2014, 20:47
Откуда: Россия

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

Сообщение SARJ 13 фев 2016, 18:43

Стоило сделать Атласом с 16 текстурами 256х256 + 128 затайлена каждая текстура по краям той же самой текстурой (итого 2048х2048). Это капец какой то :(( :(( :(( Че ж за такая юнити.... Я все какие можно параметры пробовал, какой смысл тогда вообще в этих атласах если они такое г... делают.....
minmap6.png
У вас нет доступа для просмотра вложений в этом сообщении.
SARJ
UNIт
 
Сообщения: 61
Зарегистрирован: 14 июл 2014, 20:47
Откуда: Россия

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

Сообщение Woolf 13 фев 2016, 19:28

Предположим что в майнкрафте просто в начале загрузки берется эта текстурка, приводится к размеру 512х512

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

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

При чем тут юнити, если руки кривые? Если вы хотите сделать мипмапы для атласа, то нужно уменьшать каждый фрагмент атласа отдельно, а затем заново склеивать, чтобы элементы атласа не размывались между собой. А вы что делали, то и получили. Вы хотели получить картинку, как в MC? Вы её получили на первом скриншоте "в режиме Point без мипмапов". А дальже сглаживайте постпроцессом, как и сделано в MC.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

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

Сообщение SARJ 13 фев 2016, 21:19

Woolf писал(а):При чем тут юнити, если руки кривые?

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

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

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

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

Постпроцесс - в шейдере? Что хоть делать то там надо?
Последний раз редактировалось SARJ 13 фев 2016, 22:10, всего редактировалось 1 раз.
SARJ
UNIт
 
Сообщения: 61
Зарегистрирован: 14 июл 2014, 20:47
Откуда: Россия

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

Сообщение SARJ 13 фев 2016, 22:06

Вот такой у меня атлас (PNG ARGB 32bit 2048x2048)
TexAtlas.jpg

Причем текстура берется из квадратиков (схематично нарисованы) обозначенных красным.
Смотрите какие поля вокруг оставлены, и все равно выглядит не так как надо.
У вас нет доступа для просмотра вложений в этом сообщении.
SARJ
UNIт
 
Сообщения: 61
Зарегистрирован: 14 июл 2014, 20:47
Откуда: Россия

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

Сообщение SARJ 14 фев 2016, 00:50

Нарисовал файл с мимпамами, упаковал
minmap7.png

Картина не изменилась, те же артефакты в дали. UV назначены как писал в начале, с запасом аж по пол текстуры по краям.
У вас нет доступа для просмотра вложений в этом сообщении.
SARJ
UNIт
 
Сообщения: 61
Зарегистрирован: 14 июл 2014, 20:47
Откуда: Россия

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

Сообщение SARJ 14 фев 2016, 17:23

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

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

Вторая проблема то что атлас это несколько текстур, а последние мимап уровни это каша из пикселей, а самый последний пиксель - это вообще один пиксель! (на весь атлас!)
Что собственно продемонстрировано тут http://answers.unity3d.com/questions/24 ... -a-ge.html
У вас нет доступа для просмотра вложений в этом сообщении.
SARJ
UNIт
 
Сообщения: 61
Зарегистрирован: 14 июл 2014, 20:47
Откуда: Россия


Вернуться в Shader Lab

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4