D'après un utilisateur de CGTalk (confirmé par wikipedia), Cg à été développé par Nvidia conjointement à HLSL (Langage de shader de DirectX) de Microsoft. Les deux langages se ressemblent. Cg à été proposé à l'époque en temps que langage de shader OpenGL. Le groupe "OpenGL ARB" (qui est le groupe noyaux du standard OpenGL) a refusé, lui préférant GLSL proposé par ATI/3DLabs (Je sais qu'il y a des raisons techniques à ça mais je ne les connais pas). Toujours est-il que Nvidia s'est retrouvé avec un langage sur les bras dont personne ne semblait vouloir (Microsoft utilisant HLSL et l'OpenGL ARB ayant décidé d'utiliser GLSL) mais qui était doté de très bonnes choses. Nvidia décida d'attaquer un secteur à prendre et fit de Cg, un meta-langage de shader. En gros, l'idée c'est d'écrire un shader en Cg et de le "compiler", via des profiles de compilation, dans un autre langage (cf mon futur tuto sur l'écriture de shaders en CgFX).

cgfw_bug_0001.pngToujours d'après cet utilisateur (et c'est plus ou moins ce que j'ai entendu un peu partout sur le net): Les shader codé en Cg compilé en GLSL devrait théoriquement fonctionner sur n'importe quelle carte qui supporte GLSL. En pratique, ce n'est pas le cas. Le compilateur Cg fonctionne mieux sur les cartes Nvidia. En effet, certaines commandes et/ou variables ne sont pas supportées. C'est le cas de "TANGENT" et "BINORMAL" qui ne sont tout simplement pas compris par les cartes ATI (Quand on utilise les profiles arbvp1 et arbfp1, seul profiles de compilation compris par Maya).

:longBar:
Le problème
  • Seuls les profiles de compilation arbvp1 et arbfp1 fonctionnent sous Maya. Ce sont les premiers et les plus anciens profiles de compilation.
  • Les TANGENT datas et BINORMAL datas ne sont pas supportées par les profiles de compilation arbvp1 et arbfp1 (ou bien par les cartes ATI). C'est particulièrement embêtant car nous avons besoin de stocker les tangents et binormals pour pouvoir faire du bum mapping. Il semble que Nvidia triche. En effet, si vous avez une carte du constructeur, les TANGENT datas et BINORMAL datas fonctionnent, même si les profiles de compilation sont arbvp1 et arbfp1.
:longBar:
La solution

Donc, pour pouvoir faire fonctionner la plupart des shaders d'exemples, il suffit:

  • De stocker les tangentes et les binormals dans des TEXCOORD datas au lieu des TANGENT datas et BINORMAL datas.
  • De changer les profiles de compilation (vp40 par arbvp1 et fp40 par arbfp1).
:longBar:
Exemple concret

Allons reprendre le shader "blinn bump reflect" de la librairie d'exemples Nvidia.

cgfx_intro_012.png

Liens direct vers le CgFX

Et modifiez les lignes:

struct appdata {
    ...
    float4 Tangent	: TANGENT0;
    float4 Binormal	: BINORMAL0;
};

Par:

struct appdata {
    ...
    float4 Tangent	: TEXCOORD1;
    float4 Binormal	: TEXCOORD2;
};

Ensuite, modifier le profile de compilation du vertex program (à la fin):

VertexProgram = compile vp40 std_dp_VS(...

Par:

VertexProgram = compile arbvp1 std_dp_VS(...

Et pour finir, nous modifions le profile de compilation du fragment program:

FragmentProgram = compile fp40 blinn_PS(...

Par:

FragmentProgram = compile arbfp1 blinn_PS(...

Lancez Maya, chargez votre CgFX shader, relinkez les images, créez une pointLight et entrez son nom dans le shader et paf :sourit: :

cgfx_maya_ati_radeon.png

Ça marche! :laClasse:

Ayé! Vous avez du bump! Bougez votre lumière, vous verrez!

Vous remarquerez que la couche rouge de la normal map doit être inversée pour que le bump soit correct. Ça se fait facilement (Mais ça, nous en parlerons dans la dernière partie de mon tuto sur les shaders CgXF).

:longBar:
Conclusion

J'espère que ce petit billet aidera les utilisateurs de Maya possesseurs de carte ATI qui ne comprennent pas pourquoi les Cg shaders ne fonctionnent pas sur leurs machines (c'est assez décourageant, surtout que c'est vraiment sympa de programmer ses shaders).

N'hésitez pas à laisser un commentaire si vous avez des questions.

A bientôt!

:marioCours:
:longBar:
Liens

Comme d'habitude, je vous donne quelques liens qui m'ont aidé à faire ce billet.

http://www.blacksmith-studios.dk/pr...

http://joshbeam.com/articles/cg_pix...

http://www.ofusiontechnologies.com/...