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

Как вы делали стримминг текстур без sparse ? (2 стр)

Страницы: 1 2 3 4 Следующая »
#15
13:21, 8 янв 2026

nullptr
Простой когда заливаешь большой мип в потоке рендереа

#16
13:26, 8 янв 2026

freesoft
А что сильно меняет спарсе?

#17
13:50, 8 янв 2026

Andrey
Значит сами темы мои ты, видишь :)

#18
14:04, 8 янв 2026

nullptr
Какой ты интересный ... А что у тебя уже готовое в памяти ? Оно как туда попало ?

#19
14:05, 8 янв 2026

freesoft
Стримминг текстурных массовов , говоришь ? Очень интересно

#20
14:19, 8 янв 2026

nullptr
Каков принцип необходимости загрузки ?

#21
(Правка: 15:03) 14:50, 8 янв 2026

А что сильно меняет спарсе?

Хороший вопрос.
Поддержка 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) нужно заморочиться с аллокатором в этом самом массиве текстур.
Это видимо будет простой слотовый аллокатор, тем не менее это кусок логики.
Одни текстуры выгружаем, помечаем слот как свободный, другие текстуры загружаем - ищем свободный слот.

Если что, я так не делал)

#22
14:54, 8 янв 2026

А вообще вот вдохновляющая статья про реализацию стриминга текстур:
https://wickedengine.net/2024/06/texture-streaming/

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

#23
15:02, 8 янв 2026

freesoft
В текстурном  массиве можно сделать разное число мипов ?

#24
(Правка: 15:19) 15:16, 8 янв 2026

В текстурном  массиве можно сделать разное число мипов ?

(технически это не является ограничением, и 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 килобайта. Их достаточно чтобы хоть как-то мыльно затекстурить меш, если он вновь мелькнет в кадре, и запланировать подгрузку основной текстуры.

Такая логика по идее нормально ляжет на текстурный массив.

#25
15:24, 8 янв 2026

freesoft
Кстати , в sparse можно ловить момент когда нету нужного мипа в памяти

#26
15:39, 8 янв 2026

innuendo
> nullptr
> Какой ты интересный ... А что у тебя уже готовое в памяти ? Оно как туда попало ?
Я под стримингом текстур подразумеваю увеличение и уменьшении их детализации/качества в зависимости от, например, дистанции до камеры. А ты?
Вот лежит у тебя на диске 4к текстура со всеми мипами. Ты же не будешь все эти мипы сразу грузить? Загрузишь для начала, к примеру, с 1х1 до 512х512. Потом ты каким-то образом решаешь, что нужно бы еще 1 мип (1024х1024) догрузить. - Грузишь с диска только его, а предыдущие они уже у тебя и так загружены и находятся уже в видео памяти. Вот их и копируешь из старой текстуры в новую пока в другом потоке грузишь недостающий мип. Ок?

#27
15:45, 8 янв 2026

nullptr
Как ты грузишь с диска и по какой методике ?

#28
15:49, 8 янв 2026

innuendo
> nullptr
> Как ты грузишь с диска и по какой методике ?
fopen, fread =)

#29
15:56, 8 янв 2026

nullptr
Гениально .... В каком потоке ?

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