Wenn das Profil sagt, Du kannst 96 Shaderkonstanten haben, dann klingt das für mich sehr nach VertexShader-Modell 1.1. Das ist alt - auch die Mobility-Variante einer Radeon 4870 sollte da Meilen drüber hinaus sein. Es wird also wohl eher am verwendeten Shaderprofil liegen. Und da musst Du wohl mal die CG-Doku fragen müssen, wie man das angibt oder welche der unterstützt. Bei Direct3D kann man bei der Übersetzung des Shaders ein Shaderprofil angeben, z.B. vs1_1 oder vs3_0 - vielleicht gibt es sowas auch für CG.
Und das ein float4[100] schief geht, ist doch offensichtlich, oder? Du hast doch selbst geschrieben, dass der Getter als Maximalwert nur 96 Shaderkonstanten zurückgibt. Was genau wolltest Du mit dem Experiment rauskriegen? Wenn Du mal nach column_major googelst, würdest Du lesen, dass es zwei verschiedene Schreibweisen für eine Matrix gibt: column major und row major. Die besagt eigentlich nur, in welcher Reihenfolge die Elemente der Matrix im Speicher liegen. Für eine 4x3-Matrix könnte das so aussehen:
Code: Alles auswählen
Jx Kx Lx Tx
Jy Ky Ly Ty
Jz Kz Lz Tz
Code: Alles auswählen
Jx Jy Jz 0
Kx Ky Kz 0
Lx Ly Lz 0
Tx Ty Tz 1
Ich habe hier schon dargestellt, wie die Matrix in den Konstantenregistern drinliegen würde - die Konstantenregister sind nämlich immer 4xfloat groß, egal wieviel man reinlegt. Wenn Du einen einzelnen float als Konstante definierst, wird der in einem einzelnen Konstantenregister abgelegt, also als (x, 0, 0, 1) - der Compiler kann nicht für Dich mehrere Einzelkonstanten zusammen in ein Konstantenregister legen. Daher ist bei obiger Betrachtung der Speicherlayout-Methoden auch klar, warum column_major vs. row_major auch so wichtig ist: in der einen Form brauchst Du 4 Konstanten pro Bone-Matrix, in der anderen Form nur 3. Bei 96 Shaderkonstanten macht das einen Unterschied von 24 zu 32 Bones. Ich würd mir überlegen, ob ich da nur aus Google-Faulheit soviele Bones verschenke.
[noch ein edit]Evtl. ist auch CG einfach nicht mehr unterstützt für neuere Shadermodelle. In dem Fall musst Du auf eine andere Technikbasis wechseln - es gibt da nach meinem Halbwissen auch irgendwelche ARB-Extensions, um Shader zu erstellen. Oder Du benutzt die neueste Errungenschaft von Assimp, den SplitByBoneCount-Postprocess. Der teilt Meshes auf, so dass jeder Teilmesh unterhalb einer Maximalanzahl Bones bleibt. Wenn Du den auf 20 oder wasweißich Bones konfigurierst, kriegst Du ein Rudel Teilmeshes, die Du jeweils einzeln rendern kannst.