2010-11-30 28 views
0

Je me suis cogné la tête sur mon clavier ces dernières semaines. Ce que j'essaie de faire est de charger un tableau de flottants (GLfloat) et un tableau de shorts non signés (GLushort) à partir d'un fichier texte dans des tableaux équivalents dans objective-c afin que je puisse rendre les objets contenus. J'ai mes tableaux chargés en objets vectoriels commeFormat correct pour le chargement des tableaux de vertex à partir du fichier

vector<float> vertices; 

et

vector<GLushort> indices; 

Mais pour une raison que je ne peux pas comprendre pourquoi je ne peux pas obtenir ces pour rendre. Voici mon code pour le rendu ci-dessus:

glVertexPointer(3, GL_FLOAT, sizeof(vertices[0])*6, &vertices[0]); 
glNormalPoitner(GL_FLOAT, sizeof(vertices[0])*6, &vertices[3]); 
glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(indices[0]), GL_UNSIGNED_SHORT, indices); 

tableaux exemples sont ci-dessous:

vertices: (Vx, Vy, Vz, Nx, Ny, Nz) 

{10, 10, 0, 0, 0, 1, 
-10, 10, 0, 0, 0, 1, 
-10, -10, 0, 0, 0, 1, 
10, -10, 0, 0, 0, 1}; 

indices: (v1, v2, v3) 
{0, 1, 2, 
0, 2, 3}; 

Le fichier texte que je veux charger ces tableaux de pour le rendu ressemble à ceci:

4 //Number of Vertices 
###Vertices### 
v 10 10 0 0 0 1 
v -10 10 0 0 0 1 
v -10 -10 0 0 0 1 
v 10 -10 0 0 0 1 
###Object1### 
2 //Number of faces 
f 0 1 2 
f 3 4 5 

Les objets vectoriels sont-ils la meilleure approche? Si non, qu'est-ce que c'est? Et qu'est-ce que je fais de mal que ceux-ci ne rendront pas? Merci.

+0

"Je n'arrive pas à obtenir ces rendus". Au lieu de cela, vous obtenez ... quoi? Crash? Écran noir? – genpfault

+0

Désolé je n'ai pas clarifié, il n'a juste rendu rien d'autre que mon fond de couleur claire. Idem que si j'avais commenté ma ligne glDrawElements. En parlant de cela, y a-t-il un moyen plus efficace de rendre que glDrawElements pour ce que je tente de faire? – Davido

Répondre

2

Vous utilisez GL_TRIANGLES pour spécifier le format des sommets.

alt text

Voir le graphique sur les GL_TRIANGLES, le format est erroné. Et, je préfère utiliser le format GL_TRIANGLE_STRIP. Il a besoin de quelques sommets.

+0

Je l'ai finalement fait fonctionner, pour le dernier paramètre de glDrawElements, il semblait vouloir l'adresse de mon vecteur d'indices. Je charge la géométrie à partir de fichiers OBJ, alors comment procéder pour rendre la géométrie à l'aide de bandes triangulaires si la géométrie est déjà créée? Je ne serais pas opposé à l'écriture d'un préprocesseur sur le bureau qui pourrait réorganiser les index pour tirer parti des bandes de triangle, je ne sais pas par où commencer ... – Davido

+0

Avec les sommets de votre message, je montre les sommets avec (x , y). Les sommets peuvent être (10, 10) -> (-10, 10) -> (10, -10) -> (-10, -10). – AechoLiu

+0

Je pourrais probablement réaliser la même chose en écrivant une routine d'optimisation dans mon préprocesseur de géométrie qui trouve des sommets en double, élimine les doublons et ajuste les pointeurs d'index. On dirait que la seule différence est que les sommets sont réutilisés avec des bandes triangulaires mais pas avec des triangles. Une raison pour laquelle ce ne serait pas aussi rapide ou presque aussi rapide que les bandes de triangle? – Davido