非恒定索引到均匀数组CG Shader

时间:2012-11-09 20:18:08

标签: graphics shader skinning vertex-shader cg

根据this nVidia CG tutorial(以及我自己的经验),使用非常量索引访问CG着色器中的统一数组效率低或不受支持(通常情况下,似乎不支持)。

我的问题是;我怎么能绕过这个问题?

我正在编写一个GPU蒙皮着色器,我在其中传递一个骨骼数组(4x4矩阵),我需要使用存储在顶点属性中的索引来访问(具体来说,一个float4向量,其组件被转换为整数) 。显然,由于上面提到的限制,这不起作用......也许我错过了一个更好的方法吗?

1 个答案:

答案 0 :(得分: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;
}