nullptr
Простой когда заливаешь большой мип в потоке рендереа
freesoft
А что сильно меняет спарсе?
Andrey
Значит сами темы мои ты, видишь :)
nullptr
Какой ты интересный ... А что у тебя уже готовое в памяти ? Оно как туда попало ?
freesoft
Стримминг текстурных массовов , говоришь ? Очень интересно
nullptr
Каков принцип необходимости загрузки ?
А что сильно меняет спарсе?
Хороший вопрос.
Поддержка sparse реализована аппаратно. В видеокартах вообще много чего аппаратно поддерживается, например сжатие текстур. По идее, правильная реализация страничной памяти должна работать быстрее, чем самодельная программная. На практике, есть такой баг у nvidia, и "быстрее" под вопросом:
https://forums.developer.nvidia.com/t/sparse-texture-binding-is-p… y-slow/259105
https://github.com/foijord/SparseTexture
Так что ответ - я не знаю.
Стримминг текстурных массовов , говоришь ? Очень интересно
Пример использования в шейдере:
#version 450
#extension GL_EXT_nonuniform_qualifier : require
struct Material {
int baseColorTextureId;
int normalTextureId;
// текстур столько, сколько нужно
// или можно вообще вот так
#define MAX_TEX 16
int textureId[MAX_TEX]; // и тут индексируем по мнемоникам, типа
// int textureId = materials[matId].textures[NORMAL_TEX_ID];
};
layout(set = 0, binding = 1) uniform texture2D textures[];
layout(set = 0, binding = 2) uniform sampler samplers[];
layout(std430, set = 0, binding = 3) restrict readonly buffer MaterialsBuffer {
Material materials[];
};
...
const vec4 texValue = texture(//nonuniformEXT
(sampler2D(textures[texId], samplers[samplerId])),
uv);
...Ну и дальше задачи стримера на стороне хоста:
- загрузить нужную текстуру
- поменять id текстуры в материале.
Далее идут проблемы:
1) что с размером этого самого массива текстур? если он статический, его надо брать с запасом. Если он динамический, надо чуть ли не каждый кадр будет делать его ресайз с обновлением привязки для шейдеров, что не так уж и дешево.
2) нужно заморочиться с аллокатором в этом самом массиве текстур.
Это видимо будет простой слотовый аллокатор, тем не менее это кусок логики.
Одни текстуры выгружаем, помечаем слот как свободный, другие текстуры загружаем - ищем свободный слот.
Если что, я так не делал)
А вообще вот вдохновляющая статья про реализацию стриминга текстур:
https://wickedengine.net/2024/06/texture-streaming/
Девблог крайне интересный. Движок у человека довольно мощный для инди, сочетает лаконичность и содержит все основные вехи, которые приходится пройти самодельщикам )
freesoft
В текстурном массиве можно сделать разное число мипов ?
В текстурном массиве можно сделать разное число мипов ?
(технически это не является ограничением, и 1 текстура может быть с любым кол-вом мипов).
Массив сам по себе никоим образом не влияет на свойства текстур - это самая обычная во всех отношениях текстура (если вопрос об этом).
Можно делать логику "1 текстура в массиве = 1 мип". Но тут кажущаяся простота - индекс текстуры тогда должен быть композитный и каким-то образом включать в себя номер лода.
Соответственно нужно быть уверенным в том, что нужный номер лода точно загружен, чтобы сделать правильную выборку.
Что-то вроде такого:
const vec2 colorLod = textureQueryLod((sampler2D(textures[textureId], samplers[samplerId])),
uv);
int compositeTexId = makeIndex(textureId, colorLod.x);
const vec4 texValue = texture(//nonuniformEXT
(sampler2D(textures[compositeTexId], samplers[samplerId])),
uv);Также придется учитывать, что для выборки используется не только нужный напрямую лод, но и соседние лоды - из-за всякой хитрой фильтрации.
Можно так не заморачиваться, и сделать очень простую стратегию:
- если текстура видна, она загружается целиком со всеми мипами
- если текстура не видна какое-то время, она выгружается, и оставляется только mipTail.
mipTail, если что, это "хвост" из тех мипов, которые целиком умещаются в одну страницу в 64 килобайта. Их достаточно чтобы хоть как-то мыльно затекстурить меш, если он вновь мелькнет в кадре, и запланировать подгрузку основной текстуры.
Такая логика по идее нормально ляжет на текстурный массив.
freesoft
Кстати , в sparse можно ловить момент когда нету нужного мипа в памяти
innuendo
> nullptr
> Какой ты интересный ... А что у тебя уже готовое в памяти ? Оно как туда попало ?
Я под стримингом текстур подразумеваю увеличение и уменьшении их детализации/качества в зависимости от, например, дистанции до камеры. А ты?
Вот лежит у тебя на диске 4к текстура со всеми мипами. Ты же не будешь все эти мипы сразу грузить? Загрузишь для начала, к примеру, с 1х1 до 512х512. Потом ты каким-то образом решаешь, что нужно бы еще 1 мип (1024х1024) догрузить. - Грузишь с диска только его, а предыдущие они уже у тебя и так загружены и находятся уже в видео памяти. Вот их и копируешь из старой текстуры в новую пока в другом потоке грузишь недостающий мип. Ок?
nullptr
Как ты грузишь с диска и по какой методике ?
innuendo
> nullptr
> Как ты грузишь с диска и по какой методике ?
fopen, fread =)
nullptr
Гениально .... В каком потоке ?