2 pièce(s) jointe(s)
C/C++ half (16 bit float) charger dans un VBO
Bonjours a tous.
Je travaille sur une optimisation mémoire, en l'occurrence d'un gazon encore en conception fait par des bilboards. Et je voulait m'essayer aux chargeant des half au lieu des float pour les normals. Je me suis donc référé a la norme en vigueur pour coder ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
typedef unsigned short int half ;
namespace math
{
namespace half
{
inline unsigned short int packf (const float Value)
{
const unsigned int FloatImage = * (const unsigned int *) &Value ;
unsigned short int Packed ;
Packed = (FloatImage >> 13) & 0x03FF ;
Packed |= ((((FloatImage & 0x7F800000) >> 23) - 112) << 10) & 0x7C00 ;
Packed |= (FloatImage & 0x80000000) >> 16 ;
return Packed ;
}
inline float unpackf (const ::half Value)
{
unsigned int UnPacked ;
UnPacked = (Value & 0x03FF) << 13 ;
UnPacked |= (((Value & 0x7C00) >> 10) + 112) << 23 ;
UnPacked |= (Value & 0x8000) << 16 ;
return * ((float *) &UnPacked) ;
}
}
} |
j'ai fait beaucoup, de test, vérifié des valeurs, et cela fonctionne sur le CPU, mais lorsque je charge ces half dans les VBO, il semble y avoir des problème : illustration en image :
Premiere image, le rendu est fait avec des normal codé sur 3 float
http://www.developpez.net/forums/att...1&d=1331470989
Seconde image, le rendu est fait avec des normal mais codé sur 3 half
http://www.developpez.net/forums/att...1&d=1331470989
On voit alors qu'il y a belle et bien un problème de signe sur celle ci ... Sur la première images, très peut des bilboard sont enclairé, car on est face au soleil ... logique ... :) mais pas sur le rendu avec les half :aie: Comme si le bit de signe n'était pas au placé au même endroit sur le GPU.
Quel qu'un a t'il déjà rencontrer ce problème ?