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

Кто-нибудь делал автосборку атласов на лету? (6 стр)

Страницы: 1 2 3 4 5 6
#75
0:05, 12 мая 2022

samrrr

Unigine 1.0 вообще не пускал юзера к нативному коду, только скрипты.

#76
8:35, 16 мая 2022

Huldra
> целевая платформа - raspberry pi 3, там переключение текстур - долгая операция,
Вот, кстати, вызывает интерес (у меня целевая платформа та же) - долгая потому, что драйверу приходится сверять это переключение с командным буфером каждого тайла? Или там ещё подводные камни есть?

Huldra
> в 2048x2048 слишком много не вместить
Погодь - я думал, на малине атласы больше ~500 пикселов нельзя из-за ограниченной точности в фрагментном шейдере, ибо флоат16 диктует погрешность порядка одной тысячной?
Или к текстурным координатам, прилетевшим напямую из вершинного шейдера, это ограничение не относится?

З.Ы. Я заранее настроился на жёсткую альфу + порядко-независимую стохастическую OIT и отрисовку всего отсортированным по атласу. Потому что иное на малине - утопия.

#77
(Правка: 23:44) 23:41, 16 мая 2022

Cheb
> Погодь - я думал, на малине атласы больше ~500 пикселов нельзя из-за
> ограниченной точности в фрагментном шейдере, ибо флоат16 диктует погрешность
> порядка одной тысячной?
float16 обычно это 1 bit знак 5 bit экспонента и 10 bit мантисса. То есть мантисса позволяет различить 1024 градации, однако считается что старший бит мантиссы всегда 1 и поэтому его значение не хранится в мантиссе, выходит что мантисса фактически 11 bit и можно точно представить все числа вида k/2048 при k от 0 до 2048.

0 01111 0000000000 это 1
0 01110 1111111111 это 1/2*(1+1023/1024) или 2047/2048
0 01110 0000000000 это 1/2*(1+0/1024) или 1024/2048
0 01101 1111111110 это 1/4*(1+1022/1024) или 1023/2048
и так далее
То есть целочисленные текстурные координаты в float16 могут точно задавать любой пиксел текстуры со стороной 2048.

#78
1:48, 17 мая 2022

Huldra
> float16 обычно это 1 bit знак 5 bit экспонента и 10 bit мантисса.
А ещё можно отдельно коорды спрайта в атласе и коорды в текстуре писать. А при сложении до флоата апать.

#79
12:53, 17 мая 2022

Ну вообще-то да, ректангл в атласе логичнее хранить в целочисленных текселях, а потом уже приводить к диапазону 0-1.

#80
(Правка: 21:33) 17:50, 19 мая 2022

Huldra
> То есть целочисленные текстурные координаты в float16 могут точно задавать
> любой пиксел текстуры со стороной 2048.
!
То есть, пока я не пересчитываю их в фрагментном шейдере, а использую полученные с вершинного - это работает.
Как только попробую высчитывать - накопленные погрешности устроят мне тёмную. И выше 1024 лучше не соваться.
Так?

#81
9:13, 23 мая 2022

https://github.com/DiligentGraphics/DiligentCore/blob/master/Grap… extureAtlas.h

Атлас работает на 2Д массиве, поддерживает нерезидентные текстуры, за счет чего можно минимизировать перерасход памяти.

По поводу шейдеров, тайлинга и бордюров вокруг текстур: я эту проблему решил отступом от границы участка равным максимальной проекции пикселя в текстуру:

    float2 f2AtlasDim;
    float fElements;
    Tex.GetDimensions(f2AtlasDim.x, f2AtlasDim.y, fElements);
    float2 f2Margin = 0.5 / f2AtlasDim;
    // When higher mip levels are used, the margin must be larger
    // (0.5 does not seem to always be enough, but 0.75 looks OK).
    f2Margin = max(f2Margin, float2(0.75, 0.75) * length(f2dUV_dx));
    f2Margin = max(f2Margin, float2(0.75, 0.75) * length(f2dUV_dy));
    // Limit the margin by the 1/4 of the texture region
    f2Margin = min(f2Margin, f4UVScaleBias.xy * 0.25);
    // Clamp UVs using the margin.
    f2UV = clamp(f2UV, f4UVScaleBias.zw + f2Margin, f4UVScaleBias.zw + f4UVScaleBias.xy - f2Margin);

Работает с анизотропной фильтрацией, не создает практически никаких видимых артифатков, не требует никакого зазора между текстурами.

#82
9:17, 23 мая 2022

assiduous
> Атлас работает на 2Д массиве, поддерживает нерезидентные текстуры, за счет чего
> можно минимизировать перерасход памяти.
атлас и спарсе? сало и мёд вместе?

#83
9:42, 23 мая 2022

innuendo
> атлас и спарсе? сало и мёд вместе?
>
>
Чем тебе не нравится? Спарс позволяет динамически изменять размер атласа без необходимости копировать данные из старой в новую текстуру.

#84
11:46, 23 мая 2022

innuendo
>атлас и спарсе? сало и мёд вместе?
Очень удобно зарезервировать сразу 1024 слоя текстуры, а потом уже коммитить только те слои, которые реально нужны оказались.

#85
11:51, 23 мая 2022

assiduous
> Чем тебе не нравится?
для чего атлас ? для UI в основном
я ещё могу понять для террейна спарсе самое то это да

Страницы: 1 2 3 4 5 6
ПрограммированиеФорумГрафика