samrrr
Unigine 1.0 вообще не пускал юзера к нативному коду, только скрипты.
Huldra
> целевая платформа - raspberry pi 3, там переключение текстур - долгая операция,
Вот, кстати, вызывает интерес (у меня целевая платформа та же) - долгая потому, что драйверу приходится сверять это переключение с командным буфером каждого тайла? Или там ещё подводные камни есть?
Huldra
> в 2048x2048 слишком много не вместить
Погодь - я думал, на малине атласы больше ~500 пикселов нельзя из-за ограниченной точности в фрагментном шейдере, ибо флоат16 диктует погрешность порядка одной тысячной?
Или к текстурным координатам, прилетевшим напямую из вершинного шейдера, это ограничение не относится?
З.Ы. Я заранее настроился на жёсткую альфу + порядко-независимую стохастическую OIT и отрисовку всего отсортированным по атласу. Потому что иное на малине - утопия.
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.
Huldra
> float16 обычно это 1 bit знак 5 bit экспонента и 10 bit мантисса.
А ещё можно отдельно коорды спрайта в атласе и коорды в текстуре писать. А при сложении до флоата апать.
Ну вообще-то да, ректангл в атласе логичнее хранить в целочисленных текселях, а потом уже приводить к диапазону 0-1.
Huldra
> То есть целочисленные текстурные координаты в float16 могут точно задавать
> любой пиксел текстуры со стороной 2048.
!
То есть, пока я не пересчитываю их в фрагментном шейдере, а использую полученные с вершинного - это работает.
Как только попробую высчитывать - накопленные погрешности устроят мне тёмную. И выше 1024 лучше не соваться.
Так?
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);
Работает с анизотропной фильтрацией, не создает практически никаких видимых артифатков, не требует никакого зазора между текстурами.
assiduous
> Атлас работает на 2Д массиве, поддерживает нерезидентные текстуры, за счет чего
> можно минимизировать перерасход памяти.
атлас и спарсе? сало и мёд вместе?
innuendo
> атлас и спарсе? сало и мёд вместе?
>
>
Чем тебе не нравится? Спарс позволяет динамически изменять размер атласа без необходимости копировать данные из старой в новую текстуру.
innuendo
>атлас и спарсе? сало и мёд вместе?
Очень удобно зарезервировать сразу 1024 слоя текстуры, а потом уже коммитить только те слои, которые реально нужны оказались.
assiduous
> Чем тебе не нравится?
для чего атлас ? для UI в основном
я ещё могу понять для террейна спарсе самое то это да