2009-11-19 4 views
1

J'ai ce tableau de sommet d'un cubeEn utilisant GL_SHORT au lieu de GL_FLOAT dans un tableau de sommet OpenGL ES

float vertex_coordinates [] = { 

-12.43796, -12.43796, 12.43796, -12.43796, 12.43796, 12.43796, 12.43796, 12.43796, 12.43796, 
12.43796, 12.43796, 12.43796, 12.43796, -12.43796, 12.43796, -12.43796, -12.43796, 12.43796, 
12.43796, -12.43796, -12.43796, 12.43796, 12.43796, -12.43796, -12.43796, 12.43796, -12.43796, 
-12.43796, 12.43796, -12.43796, -12.43796, -12.43796, -12.43796, 12.43796, -12.43796, -12.43796, 
-12.43796, -12.43796, -12.43796, -12.43796, 12.43796, -12.43796, -12.43796, 12.43796, 12.43796, 
-12.43796, 12.43796, 12.43796, -12.43796, -12.43796, 12.43796, -12.43796, -12.43796, -12.43796, 
12.43796, -12.43796, 12.43796, 12.43796, 12.43796, 12.43796, 12.43796, 12.43796, -12.43796, 
12.43796, 12.43796, -12.43796, 12.43796, -12.43796, -12.43796, 12.43796, -12.43796, 12.43796, 
-12.43796, 12.43796, 12.43796, -12.43796, 12.43796, -12.43796, 12.43796, 12.43796, -12.43796, 
12.43796, 12.43796, -12.43796, 12.43796, 12.43796, 12.43796, -12.43796, 12.43796, 12.43796, 
-12.43796, -12.43796, -12.43796, -12.43796, -12.43796, 12.43796, 12.43796, -12.43796, 12.43796, 
12.43796, -12.43796, 12.43796, 12.43796, -12.43796, -12.43796, -12.43796, -12.43796, -12.43796, 

}; 

Au moment où je rends à l'aide

glVertexPointer(3, GL_FLOAT, 0, vertex__coordinates); 

// texture pointer ... 

// colour pointer 

glDrawArrays(GL_TRIANGLES, 0, size); 

Comment pourrais-je aller sur la conversion de la vertex tableau dans les valeurs qui rendraient exactement le même cube mais en utilisant à la place GL_SHORT comme deuxième paramètre à glVertexPointer afin d'accélérer mon code?

Répondre

3

Dans une étape de pré-traitement on calcule min et max de l'objet et l'utiliser pour maximiser l'utilisation de la précision dans un court laps:

float modelMin[3] = {FLT_MAX, FLT_MAX, FLT_MAX}; //or std::numeric_limits<float> 
float modelMax[3] = {-FLT_MAX, -FLT_MAX, -FLT_MAX}; 
for (int i = 0; i < size; ++i) { 
    for (int j = 0; j < 3; ++j) { 
     const float v = vertex_coordinates[i * 3 + j]; 
     modelMin[j] = std::min(modelMin[j], v); 
     modelMax[j] = std::max(modelMax[j], v); 
    } 
} 

short* short_coordinates = new short[size * 3]; 
for (int i = 0; i < size; ++i) { 
    for (int j = 0; j < 3; ++j) { 
     const float src = vertex_coordinates[i * 3 + j]; 
     short& dst = short_coordinats[i * 3 + j]; 
     dst = (short)floorf(((src - modelMin[j])/(modelMax[j] - modelMin[j])) * 65536.0f - 32768.0f + 0.5f); 
    } 
} 

Et quand le dessin nous faisons ce qui suit:

const float scale[3], bias[3]; 
for (int i = 0; i < 3; ++i) { 
    scale[i] = (modelMax[j] - modelMin[j])/65536.0f; 
    bias[i] = (32768.0f/65536.0f) * (modelMax[j] - modelMin[j]) + modelMin[j]; 
} 

glTranslatef(bias[0], bias[1], bias[2]); 
glScalef(scale[0], scale[1], scale[2]); 
glVertexPointer(3, GL_SHORT, 0, short_coordinates); 
glDrawArrays(GL_TRIANGLES, 0, size); 

/AB

0

au lieu de (+ -) 12,43796 utilisation (+ -) 1

appliquent alors une opération glScalef sur votre matrice modelview de 12,43796

Je doute que cela accélérerait votre code, cependant. Tout ce qu'il fera est de réduire votre tableau de vertex à la moitié de sa taille d'origine.

+0

merci! Cependant, comment pourrais-je appliquer cette logique si j'avais plusieurs cubes de différentes tailles (+ -6 par exemple)? – Dimitris

+2

Sur l'iPhone, les réductions de la taille de la matrice de vertex conduisent à des augmentations de performances significatives. Passer d'un flottant à un court métrage a amélioré ma performance de rendu de 30% par lui-même. Dimitris, pour appliquer cela à différents cas, vous auriez juste besoin de normaliser vos valeurs à virgule flottante à + -32767. Trouvez la plus grande valeur absolue de n'importe quelle coordonnée vertex, et multipliez toutes vos valeurs de vertex par 32767 divisé par cette valeur. Vous pouvez ensuite ajuster votre vue de modèle ou votre matrice de projection pour qu'elle corresponde à la nouvelle taille mise à l'échelle. –

+0

La suggestion de Brad fonctionne, mais seulement si votre modèle est centré autour de (0,0,0). Vous aurez besoin d'une échelle régulière et d'un biais si ce n'est pas le cas. – Alan

Questions connexes