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

Текстурный атлас, на сколько актуален?

Страницы: 1 2 Следующая »
#0
(Правка: 6:38) 5:23, 30 июля 2020

Сабж исключительно для себя, с целью разобраться надо оно мне или нет.
Так случилось, что я им не пользовался.

Сначала я биндил текстуры по одной, а потом резко перешел на ssbo c биндлесами. Но у биндлесов проблемы с совместимостью.
Собственно вопрос, стоит ли отказаться от биндлесов и перейти на текстурные атласы?

Если стоит перейти на текстурный атлас, то с чего лучше начать ознакомление с темой (динамический вариант, интересно только как менеджерить пространство листов атласа)? Как быть с тайловыми текстурами ?


#1
6:56, 30 июля 2020

vindast
> Собственно вопрос, стоит ли отказаться от биндлесов и перейти на текстурные атласы?
Атласы как бы для одного, биндлесы для другого. Там и там свои преимущества и недостатки. Поэтому вопрос про "перейти с одного на другое" как-то абсурден. Это как спросить, стоит ли переходить с автомобиля на велосипед.

> Если стоит перейти на текстурный атлас, то с чего лучше начать ознакомление с
> темой (динамический вариант, интересно только как менеджерить пространство
> листов атласа)?
Вот, держи:
https://blackpawn.com/texts/lightmaps/default.html

> Как быть с тайловыми текстурами ?
Тайловость либо на шейдере, либо никак.

#2
7:43, 30 июля 2020

vindast
> Собственно вопрос, стоит ли отказаться от биндлесов и перейти на текстурные
> атласы
Как бы текстурные атласы незаменимы, если конечно у тебя не все текстуры одного размера 1024x1024 или навроде того.

#3
(Правка: 10:13) 10:13, 30 июля 2020

MikeNew
> если конечно у тебя не все текстуры одного размера 1024x1024 или навроде того.
Ну дык, если вариантов разрешений не так много, то вполне можно заменить на несколько текстурных массивов)

Вообще вопрос не очень понятен, атласы для чего? Автоматически паковать всю сцену в атласы? Сомнительное решение (что если быстро какой-то объект надо выгрузить из памяти, а другой вгрузить - перепаковка? Как маппишь объекты в атласы - через повертексные UV - перестройка всех мешей? Это медленно. Через пообъектные константы? Тогда дипы не экономятся).
Автоматически паковать лайтмапы и подобные текстуры? Да, тут уже полезнее.

MrShoor
> Тайловость либо на шейдере, либо никак.
Вери хард шейдер вариант: переимплементация фильтрации (включая анизо) на шейдере (выйдет медленнее обычной).
Приемлемый шейдер вариант: всем текстурам добавляются края с тайлингом их в несколько пикселей, UV читают внутри, фильтрация берёт с краёв. Шейдер делает frac UV и читает через tex2Dgrad, чтобы не было швов. Для этого также придётся хранить не просто UV текстуры но и начало/размер тайла в атласе.
Приемлемый нешейдер вариант: геометрия автоматически режется дополнительными рёбрами на краях всех тайлов, в итоге ни в каком месте UV не выходят за 0-1 диапазон. Используются дополнительные краешки как в варианте выше (такая оптимизация была когда-то проведена в старом Faded прототипе).

#4
(Правка: 16:53) 16:47, 30 июля 2020

MrShoor
> Тайловость либо на шейдере, либо никак.
Как поспал так сразу понял что f2UV = frac(f2ModelUV) * f2ScaleUV + f2OffsetUV;

MrShoor
> Атласы как бы для одного, биндлесы для другого. Там и там свои преимущества и
> недостатки. Поэтому вопрос про "перейти с одного на другое" как-то абсурден.
> Это как спросить, стоит ли переходить с автомобиля на велосипед.
Я сейчас понял что этот атлас мне не нужОн.

Я тут с биндлесами столкнулся с проблемой. Мне нужна догрузка лодов текстур с диска, и соответственно, нужно ограничить выборку mip уровней, пока все они не загружены.

void TextureBuilder::setTextureMipLevels(Texture2D& texture, int minLevel, int maxLevel)
{
  GLError::cheakMessageLog("Set texture 2d level begin");

  glBindTexture(GL_TEXTURE_2D, texture._textureId); 

  GLError::cheakMessageLog("Set texture 2d level (glBindTexture)");

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, minLevel);
  GLError::cheakMessageLog("Set texture 2d level (GL_TEXTURE_MIN_LOD)");

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, maxLevel);

  GLError::cheakMessageLog("Set texture 2d level (GL_TEXTURE_MAX_LOD)");
}

Но этот код для биндлеса генерит invalid operation, тк биндлес immutable. Думал щас сделаю себе текстурные атласы и заживу. Предрасчитанный атлас мне не годится, тк я до одури хочу сделать себе open-world (моя идея фикс).

Отоспался и понял, что атлас такую проблему не решит. Тк такой код ограничит выборку из всех текстур в атласе, а не только в не загруженной.
Ввидимо придется любоваться черными текстурами для ближних лодов некоторое время пока они не загрузятся.

MikeNew
> Как бы текстурные атласы незаменимы, если конечно у тебя не все текстуры одного
> размера 1024x1024 или навроде того.
Если в атласе текстуры все одного размера, то менеджерить его память элементарно. Как по мне логичное ограничение, 1024 на 1024 сейчас самое то. Да и можно ввести атлас для текстур разного размера.

#5
21:48, 30 июля 2020

vindast

Посмотри sparse textures. Можно создать sparse texture_array под каждый размер текстуры и делать слои (или даже отдельные ее части, т.н. "страницы") резидентными/не резидентными в зависимости от того была ли загружена текстура (или ее часть).

#6
(Правка: 4:37) 4:37, 31 июля 2020

0xc0de
Не нагуглил ничего полезного по этой штуке.

#7
13:53, 31 июля 2020

Mr F
> Вери хард шейдер вариант: переимплементация фильтрации (включая анизо) на
> шейдере (выйдет медленнее обычной).
Анизо на шейдере? Можно пример?

#8
16:17, 31 июля 2020

barnes
> Можно пример?
у меня нету, я просто имел в виду, что если не учитывать в атласе доп краешки для хардварной фильтрации, то придётся писать свою фильтрацию (и лучше до такого не доводить)

#9
16:49, 31 июля 2020

vindast
> Не нагуглил ничего полезного по этой штуке.

Гугли AZDO. Там это есть.

#10
17:33, 31 июля 2020

Mr F
> и лучше до такого не доводить
Я пробовал фильтр ланчоса, но без мипов, на лоурезе выглядело интереснее линейного фильтра. А по скольку картинка была 320 на 240 гдето, особого фреймдропа и небыло

#11
20:21, 31 июля 2020

0xc0de
почитал, вроде интересно.
Но всего один вопрос. На каком железе это нормально работает ?

#12
22:12, 31 июля 2020

vindast
> а потом резко перешел на ssbo c биндлесами

резко сделай рендер с amd intel

#13
(Правка: 15:29) 15:26, 1 авг. 2020

innuendo
Ага. Мой двиг с амд резко отказался работать после полного перевода на биндлессы. Ошибка в гл драйвере. Хотя, по первости было все ок, когда я только часть рендера на них перевёл. Щас амд карты нет и отладить не могу. А на интел мне плевать.

#14
(Правка: 17:06) 17:04, 1 авг. 2020

barnes
у меня rx480, полет нормальный. Работает и на некоторых более старых моделях.

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