2010-05-14 2 views
3

Alors que mon projet se rapproche de l'étape d'optimisation, je remarque que la réduction des métadonnées Vertex pourrait grandement améliorer les performances du rendu 3D.J'ai un problème pour utiliser GLshort pour représenter Vertex, et Normal

Finalement, j'ai cherché autour de moi et j'ai trouvé les conseils suivants de stackoverflow.

Using GL_SHORT instead of GL_FLOAT in an OpenGL ES vertex array

How do you represent a normal or texture coordinate using GLshorts?

Advice on speeding up OpenGL ES 1.1 on the iPhone

Des expériences simples montrent que le passage de "Float" à "SHORT" pour le sommet et normal n'est pas difficile, mais ce qui me dérange est quand vous êtes pour redimensionner les verticies à leur taille originale (avec glScalef), les normales sont multipliées par l'inverse de l'échelle. Remède naturel pour cela est de multiplier les normales w/échelle avant de vous soumettre à GPU. Ensuite, mes normales courtes deviennent presque 0, parce que le facteur d'échelle est généralement plus petit que 0. Duh!

Comment utilisez-vous "court" à la fois pour le vertex et normal en même temps? J'ai essayé ceci et cela pendant environ une journée entière, mais je ne pouvais aller que pour "vertex float w/byte normal" ou "vertex court w/float normal" jusqu'à présent.

Votre aide serait grandement appréciée.

+0

le facteur d'échelle est inférieur à 0? – UncleZeiv

Répondre

1

Vous ne pouvez pas simplement normaliser vos normales en appelant cela?

glEnable(GL_NORMALIZE); 

Ce ne est pas idéal, car normalisant sera probablement frappé le GPU un peu, mais cela dépend vraiment si votre goulot d'étranglement est causée par les données de passage au GPU ou par le GPU fait trop. Comme pour toute optimisation, vous avez besoin de comprendre qui donne la meilleure vitesse. Je suppose que vous êtes probablement ralenti en passant les données de vertex de sorte que vous obtiendrez une accélération.

+0

J'ai pensé à la normaliser mais je n'ai jamais vraiment essayé cela parce que "normaliser" est généralement déprécié de tous les articles que j'ai lus. Mais vous avez raison. De plus, il y aura toujours des compromis, quoi qu'il arrive. Je vais essayer rapidement. Merci beaucoup. – Xylopia

0

choses possibles à essayer:

  • tenter de contrer l'échelle en bidouillant avec la matrice GL_NORMAL
  • utiliser un vertex shader pour effectuer les calculs que vous le souhaitez
  • n'échelle pas vos données de sommet vers le bas, agrandissez vos matrices de caméra à la place
+0

La matrice 1.GL_NORMAL me semble bonne. Je vais essayer de comparer entre cela et GL_NORMALIZE. 2) Mon proj est sur un tube de rendu fixe donc pas de vertex shader. 3) Élargir ma matrice de caméra ... n'est pas possible non plus parce que je fournis tout directement à l'espace de modélisation. :( Merci pour la matrice GL_NORMAL :) – Xylopia

+0

comme pour 3), vous pouvez faire face à un plus grand "modelview space", à moins que je ne manque quelque chose. Ce que je veux dire c'est que vous devriez avoir le contrôle à un certain point sur la façon de mapper le monde aux coordonnées de l'écran, et vous devriez pouvoir en profiter ... encore une fois, à moins que je ne manque quelque chose. – UncleZeiv

Questions connexes