2010-05-19 5 views
1

У меня есть вершинный шейдер (2.0), выполняющий некоторые instancing - каждая вершина указывает индекс в массив.HLSL: индекс для неуравновешенных/упакованных поплавков

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

float instanceData[100]; 

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

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

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

Также: каковы последствия для выполнения этого? Это на самом деле стоит? (Для меня это сэкономит около одной партии каждые четыре или пять).

ответ

3

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

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

Да, это работает, спасибо. Удобно знать, что вы можете индексировать субэлементы. Для справки - в моей ситуации это индексирование занимает 14 слотов инструкций и 4 постоянных регистра. –