Auteur Sujet: problème avec les uniforms types double en Cg  (Lu 1950 fois)

0 Membres et 1 Invité sur ce sujet

Bonjour,
J'ai un soucis avec le langage Cg pour mes shaders. J'ai besoin de passer des variables de type uniform double au fragment shader, mais ca ne fonctionne pas, les variables sont mises à 0 du côté shader. Par contre, en remplaçant par des float ça marche (mais je n'ai pas la précision des doubles ofc)
Mon gpu est un gtx580, et en glsl, les doubles fonctionnent bien.
Quelqu'un aurait-il connaissance de ce problème des doubles en Cg ? Je ne trouve pas de doc sur ce sujet...

C'est dans quel contexte que tu fais du Cg ?
Parce que bon, le Cg peut génèrer du GLSL et si tu dis que les doubles fonctionnent en GLSL... Bah je me demande: pourquoi utiliser du Cg ?

J'utilise le Cg pour la portabilité, et éviter d'avoir à coder plusieurs versions en glsl selon les capacités des cgu.
J'ai besion de double précision car je travaille sur des fractales en temps réel, et je souhaite avoir une grande amplitude d'échelle. En float on atteint vite la limite...
Mais ma question soulève un problème que peut-être d'autres ont pu constater, à savoir le passage de types uniform double en Cg. Tu as déjà rencontré ça ?

J'ai jamais utilisé de double nulle part, en HLSL c'est chiant comme la mort à utiliser (warnings de casts de partout) et de toute manière il est en souvent double en précision interne (ça dépend des GPU je crois).
Du coup non, désolé j'en n'ai jamais utilisé explicitement...

En tout cas, en HLSL non plus on peut pas passer de doubles par des uniforms, on est obligés de passer 2 UINT et recomposer en double. Je cite la doc:

Citer
double - 64-bit floating point value. You cannot use double precision values as inputs and outputs for a stream. To pass double precision values between shaders, declare each double as a pair of uint data types. Then, use the asdouble function to pack each double into the pair of uints and the asuint function to unpack the pair of uints back into the double.

Est-ce qu'il existe l'équivalent de "asdouble" en Cg ?

Dans la doc de Cg 1.2 il y a ces fonctions:

Citer
void cgSetParameter1d(CGparameter param, double x);
void cgSetParameter2d(CGparameter param, double x, double y);
void cgSetParameter3d(CGparameter param, double x, double y, double z);
void cgSetParameter4d(CGparameter param, double x, double y, double z, double w);

Et tu dis que ça marche pas ?

En effet, selon la doc du Cg, on peut utiliser les doubles comme les float...d'où mon désarroi. Je vais essayer la méthode dont tu parles, en passant par des uint. Oah la bidouille!

Pas moyen de packer deux uint32 en un double avec Cg. Mais en cherchant des informations, je constate que les types double sont très aléatoirement gérés par les cartes graphiques. Le Cg doit imposer des restrictions dont j'ignore les règles...la joie des langages "évolués".
Si un dieu du code tombe sur ce sujet et connaît une solution/explication, je reste ouvert!