HLSL: индекс для не выровненных / упакованных поплавков - PullRequest
1 голос
/ 19 мая 2010

У меня есть вершинный шейдер (2.0), который выполняет инстансинг - каждая вершина указывает индекс в массиве.

Если у меня есть такой массив:

float instanceData[100];

Компилятор выделяет ему 100 константных регистров. Каждый регистр констант равен float4, поэтому он выделяет в 4 раза больше места, чем необходимо.

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

В идеале я хотел бы, чтобы метод по-прежнему выглядел как float[] как на CPU, так и на GPU (сейчас я звоню EffectParamter.SetValue(Single[]), я использую XNA). Но можно вручную упаковать и распаковать float4[].

Кроме того: как это влияет на производительность? Стоит ли это на самом деле? (Для меня это сэкономит примерно одну партию из каждых четырех или пяти).

1 Ответ

3 голосов
/ 20 мая 2010

Помогает ли это?:

float4 packedInstanceData[25];
...
float data = packedInstanceData[index / 4][index % 4];
...