2010-11-30 8 views
0

Ich habe in den letzten paar Wochen meinen Kopf auf meiner Tastatur geschlagen. Was ich versuche, ist ein Array von Floats (GLfloat) und ein Array von unsigned shorts (GLushort) aus einer Textdatei in äquivalente Arrays in objective-c zu laden, damit ich die enthaltenen Objekte rendern kann. Ich habe meine Arrays bekam geladen in Vektor-Objekte alsKorrektes Format zum Laden von Vertex-Arrays aus Datei

vector<float> vertices; 

und

vector<GLushort> indices; 

Aber aus irgendeinem Grund, den ich nicht herausfinden können, warum ich nicht diese zu machen bekommen. Hier ist mein Code für die Wiedergabe des oben:

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); 

Probe-Arrays sind unter:

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}; 

Die Textdatei ich von diesen Arrays geladen werden soll für wie folgt aussieht Rendering:

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 

Sind Vektorobjekte der beste Ansatz? Wenn nicht, was ist? Und was mache ich falsch, dass diese nicht rendern? Vielen Dank.

+0

"Ich kann diese nicht zum Rendern bringen". Stattdessen bekommst du ... was? Absturz? Schwarzer Bildschirm? – genpfault

+0

Tut mir leid, ich habe nicht geklärt, es hat nur nichts gerendert, außer meinem clearcolor Hintergrund. So, als hätte ich meine glDrawElements-Zeile auskommentiert. Apropos, gibt es eine effizientere Möglichkeit, als glDrawElements für das, was ich versuche, zu machen? – Davido

Antwort

2

Sie verwenden GL_TRIANGELS, um das Vertices-Format anzugeben.

alt text

die Grafik sehen über GL_TRIANGLES, ist Ihr Format falsch. Und ich bevorzuge, GL_TRIANGLE_STRIP Format zu verwenden. Es braucht nur wenige Ecken.

+0

Ich habe es schließlich funktioniert, für den letzten Parameter von glDrawElements schien es, als wollte ich die Adresse zu meinem Vektor von Indizes haben. Ich lade Geometrie aus OBJ-Dateien, also wie würde ich das Rendern der Geometrie mit Dreiecksstreifen machen, wenn die Geometrie bereits erstellt wurde? Ich würde nicht dagegen stehen, einen Präprozessor auf dem Desktop zu schreiben, der die Indizes neu anordnen könnte, um Dreiecksleisten auszunutzen, einfach nicht sicher, wo ich anfangen würde ... – Davido

+0

Mit den Scheitelpunkten in Ihrem Post zeige ich die Scheitelpunkte mit (x , y). Der Vertices-Fluss kann (10, 10) -> (-10, 10) -> (10, -10) -> (-10, -10) sein. – AechoLiu

+0

Ich könnte wahrscheinlich dasselbe erreichen, indem ich eine Optimierungsroutine in meinen Geometrie-Präprozessor schreibe, die doppelte Scheitelpunkte findet, Duplikate eliminiert und die Indexzeiger anpasst. Es scheint, als ob der einzige Unterschied darin besteht, dass Scheitelpunkte mit Dreiecksstreifen wiederverwendet werden, aber nicht mit Dreiecken. Irgendein Grund, warum dies nicht so schnell oder fast so schnell wäre wie Dreiecksstreifen? – Davido