Непостоянный индекс в единый массив CG Shader
Согласно этому руководству nVidia CG (и моему собственному опыту), доступ к унифицированным массивам в шейдерах CG с непостоянным индексом либо неэффективен, либо не поддерживается (чаще всего кажется, что неподдерживаемый).
Мой вопрос как я могу обойти эту проблему?
В настоящее время я пишу шейдерный шкур для графического процессора, в котором я передаю массив костей (матрицы 4х4), к которому мне нужно получить доступ, используя индекс, хранящийся в атрибуте вершины (в частности, вектор float4, компоненты которого приводятся в целые числа). Очевидно, что из-за ограничений, упомянутых выше, это не работает... возможно, мне не хватает лучшего способа сделать это?
1 ответ
Это действительно распространенный способ сделать это, например (это HLSL, но по сути то же самое - обратите внимание на глобальную униформу 'boneArray')
float4x3 CalcBoneTransform(float4 blendWeights, float4 boneIndices)
{
// Calculate normalized fourth bone weight2
float4 weights = float4(blendWeights.x, blendWeights.y, blendWeights.z , 1.0f - blendWeights.x - blendWeights.y - blendWeights.z);
// Calculate bone transform
float4x3 boneTransform;
int4 indices = boneIndices;
boneTransform = weights.x * boneArray[indices.x];
boneTransform += weights.y * boneArray[indices.y];
boneTransform += weights.z * boneArray[indices.z];
boneTransform += weights.w * boneArray[indices.w];
return boneTransform;
}