Очень медленная выборка текстур Direct3D

9

Поэтому я пишу небольшую игру с использованием Direct3D 9 и использую мультитекстурирование для ландшафта. Все, что я делаю, это сэмплирую 3 текстуры и карту наложения и получаю общий цвет из трех текстур на основе цветовых каналов с карты наложения. В любом случае, я получаю значительное падение частоты кадров, когда беру более 1 текстуры, я делаю скорость от 120+ кадров в секунду до чуть менее 50.

Это код HLSL, ответственный за замедление:

float3 ground = tex2D(GroundTex, multiTex).rgb;
float3 stone  = tex2D(StoneTex, multiTex).rgb;
float3 grass  = tex2D(GrassTex, multiTex).rgb;
float3 blend  = tex2D(BlendMapTex, blendMap).rgb;

Я делаю это неправильно? Если у кого-то есть информация или советы по сэмплированию текстур или что-то еще, это было бы неплохо.

Спасибо.

dotminic
источник
Какое оборудование у вас есть? Четыре образца текстуры не должны быть проблемой на любом новом оборудовании.
Аксель Гнейтинг
У меня Radeon X1950, да, ему пару лет, если не больше. Я предполагаю, что это, возможно, не лучшее оборудование. Что вы думаете ?
dotminic 27.10.10

Ответы:

9

Если вы хотите ускорить процесс, вы можете использовать то, что называется текстурным атласом.

Википедия - текстурный атлас - это большое изображение, или «атлас», который содержит множество небольших подизображений, каждое из которых является текстурой для некоторой части трехмерного объекта. Субтекстуры можно визуализировать, изменив текстурные координаты uvmap объекта на атласе, по сути, сообщив ему, в какой части изображения находится его текстура. В приложении, где часто используется много небольших текстур, часто более эффективно храните текстуры в атласе текстур, который обрабатывается графическим оборудованием как единое целое.

Для графического процессора более эффективно 4 раза выбирать одну большую текстуру по сравнению с 4 образцами, взятыми по одному разу. Вот пример текстурного атласа местности.

альтернативный текст

zfedoran
источник
1
Спасибо за совет, я реализовал свой шейдер с использованием текстурного атласа, теперь я "только" получаю 109 кадров в секунду, но это отличное улучшение по сравнению с 55 кадрами в секунду, которые я получал. Спасибо!
dotminic
1
+1 за хороший ответ. Могу я спросить, откуда у тебя это изображение текстуры атласа? Это запатентованное или бесплатное для любого использования?
Кэмерон
4

Еще одна вещь, которую следует учитывать, это формат текстур. Это необработанная текстура 32bpp? Если это так, рассмотрите возможность использования сжатой текстуры DXT1, которая составляет 4 бита / пиксель (занимая 1/8 пробела), или DXT5, если вам нужен альфа-канал, со скоростью 8 бит / пиксель.

Уменьшение размера текстурных данных должно привести к снижению требований к пропускной способности текстурной памяти и повышению производительности кэша текстур.

Кроме того, убедитесь, что вы не устанавливаете максимальную качественную анизотропную фильтрацию - это может добавить немало затрат.

bluescrn
источник
спасибо за совет, я попробую в следующий раз.
dotminic
3

У ваших текстур есть мипмапы?

Без mipmapping выборка текстуры может быть особенно дорогой (загрузка кеша отсутствует)

bluescrn
источник
Да, текстуры имеют мипмапы, я экспортировал их как * .dds из инструмента текстур DirectX. Но как они используют текстуры в коммерческих играх, где повсюду множество текстур высокой четкости? Я просто пробую 1 атлас текстуры и получаю частоту кадров 109 кадров в секунду при рендеринге ландшафта, все на GPU.
dotminic 27.10.10