Непостоянный индекс в единый массив 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;
}
Другие вопросы по тегам