wieder mal terrain
-
ich wollte aber eigentlich noch keinen vertex buffer verwenden . . .
-
Tja, früher oder später kommt der Moment für Umschwünge, du solltest es wagen, denn das ganze in nem Mesh zu halten, halte ich für keine gute Idee...
mfG D1B
-
hm .. . okay, ich machs mit den vertex arrays :), aber ich kann die vertices und indices ja trotzdem in der mesh struktur speichern, oder?!
-
Hey, wenn du schon VertexArrays benutzt, kannst du auch VertexBuffer nehmen... Wovor hast du denn Angst? Du kannst es auch in als Mesh halten, aber ich finds nich gut... :p
-
wo legst du dann deine arrays an?
-
Ich hab keine Arrays...
-
okay, dann hab ich noch eine frage: ab wieviel dreiecken rentierten sich vertex arrays? rentiert es sich zB wenn ich für ein sprite, das eben aus nur 2 dreiecken besteht extra einen vertexpointer mache??
-
Ich denke bei dieser Aufgabe ist das nicht so wichtig, da kann man bestimmt woanders mehr optimieren, ich wüsste aber nicht, was schlimm daran sein sollte, wenn man das als VertexBuffer machen würde! Wenn ich Recht gehe in der Annahme, dass diese beiden Dreiecke ein Rechteck bilden, haben sie zwei Punkte gemeinsam. Wenn man dann noch einen Indexbuffer hat, bräuchten im Vertexbuffer nur 4 Vertices stehen und im Indexbuffer nur sechs Zahlen, ist also vom Speicher die bessere Variante...
mfG D1B
-
okay, danke ... vertex buffer, index buffer?? ich hab gedacht vertex array IST ein vertex buffer in ogl?!
-
Oh sorry, ich hab voll vergessen, dass du OGL verwendest, wenn du das denkst, wird das so sein, lass dich da nicht von mir irritieren, such mal nach IndexBuffer (oder IndexArray), wenn du irgendne Hilfe hast. Sonst machstes halt wie gewohnt mit deinem VertexArray (ich dachte das wär was anderes... )
-
okay, danke für deine schnellen antworten!
-
na klar, immer wieder gern...
-
mein quellcode zum laden der heightmap sieht inzwischen so aus:
... vertices = new CVector3D[nSize * nSize]; texcoords = new CTexcoord[nSize * nSize]; indices = new CVector3D[nSize * nSize * 6]; CVector3D vert; CTexcoord uvcoord; int CurrVertex = 0; int texdelta = 0; for (int y=0; y < nSize; y++) { for (int x=0; x < nSize; x++) { CurrVertex = y * (nSize/1) + x; vert.v[0] = (float)x; vert.v[2] = (float)y ; vert.v[1] = (float)(heightMap.data[CurrVertex * 3]); uvcoord.set (((float)x * texdelta * 0.5f), (1.0f - (float)y * texdelta * 0.5f)); vertices[CurrVertex] = vert; texcoords[CurrVertex] = uvcoord; } } int idx = 0; for (y = 0; y < (nSize - 1); y++) { for (int x=0; x < (nSize - 1); x++) { CurrVertex = y * (nSize/1) + x; indices[idx].v[0] = (CurrVertex+ 1); //+sSize indices[idx].v[1] = (CurrVertex + 1); indices[idx].v[2] = (CurrVertex + (nSize)); indices[idx+1].v[0] = (CurrVertex + (nSize)+1); indices[idx+1].v[1] = (CurrVertex + (nSize)); indices[idx+1].v[2] = (CurrVertex + 1); idx += 2; } ... }
und der zum rendern so:
glVertexPointer(3, GL_FLOAT, sizeof(CVector3D), &vertices[0].v[0]); glTexCoordPointer(2, GL_FLOAT, sizeof(CTexcoord), &texcoords[0].t[0]); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glDrawElements(GL_POINTS, 1000*20, GL_UNSIGNED_SHORT, &indices[10].v[0]); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY);
wobei das 1000*20 einfach eine zahl ist die ich mir gedacht habe, dass sie groß genug ist
aber leider kommt eine unhandled exeption findet ihr einen fehler??
bitte!
thx im vorraus
stefan
-
@<stefan>
- aus Performanzgruenden am besten interleaved arrays verwenden.- glDrawElements(GL_POINTS, 1000*20, GL_UNSIGNED_SHORT, &indices[10].v[0]);
Warum GL_POINTS? - Hab gedacht du moechtest Triangles ===> GL_TRIANGLES, noch besser GL_TRIANGLE_STRIP, dazu musst enstprechend Dein Index- Array aufbauen.- 1000*20??? Nicht gut, Du kannst nur so viel zeichnen wie Du hast. Du musst hier Dir die exakte Zahl eintragen.
An Deiner Stelle wuerde ich erst mal ein kleines Minibeispiel programmieren, und nicht grad ein Terrain. Im Prinzip ist es trivial, aber mir scheint, dass Du das noch nicht so richtig verstanden hast, also:
1)- Buch lesen
2)- verstehen
3)- Minibeispiel programmieren
- ...und dann das ganze als Terrain
Schritt 1)-3) ungefaehr halber Nachmittag Zeitaufwand.
~tOmUsA[ Dieser Beitrag wurde am 26.02.2003 um 08:24 Uhr von tOmUsA editiert. ]
-
Hab deinen Rat befolgt und naja ich glaube ich habs noch nicht ganz draußen, bei den
ganzen beispielen die ich mir angeschaut habe hat ein array so ausgesehen:
float vertices[ZahlderVertices][3];ich will das aber nicht direkt mir floats machen sondern über meine Vector Klasse und über einen pointer:
CVector3D *vertices;
vertices = new CVector3D[ZahlderVertices];wie sag ich jetzt aber opengl, dass ich da meine klasse dafür verwende.
bei den beispielen ging ja einglVertexPointer(3, GL_FLOAT, 0, vertices)
aber wie kann ich das machen??
hab
glVertexPointer(3, GL_FLOAT, 0, &vertices[0].v[0])
probiert, aber das geht nicht.
pls, thx im vorraus
stefan
-
Sollte eigentlich mit Deiner CVector3D klasse klappen. Sie darf dann jedoch nur die 3 bzw. 4 Komponenten x, y, z und w enthalten (und natuerlich die member funktionen), sollte so aussehen:
class vector3D { public: float x, y, z; };
...dann sollte es gehen. ~tOmUsA
-
dann muss
class vector3D { public: float v[3]; // . . . // };
auch gehen oder?!
aber wie übergeb ich das dann an glVertexPointer(...)?!danke schon mal im vorraus!
cu
-
Original erstellt von <stefan>:
**dann mussclass vector3D { public: float v[3]; // . . . // };
auch gehen oder?!
cu**Ja, aber ausser Deinem float v[3] darf nichts anderes drin stehen...dann hast Du Deine vertices in der Art vector3D verts[SIZE] gespeichtert....konvertiere sie in einen GLfloat*:
GLfloat* p = (GLfloat*)verts;...und uebergib diesen an glVertexPointer()...sollte eigentlich so funktionieren.
~tOmUsA
-
?
v[0] ist das selbe wie x
v[1] - " - y
v[2] - " - zaber ich werts eh auf x,y,z umschreiben, hab das nur mit einem array gemacht dass ich glVertex3fv verwenden kann...
-
habs inzwischen geschafft
aber multi texturing funzt noch nicht
obwohl ich glActiveTextureARB(:..) durch glClientActiveTextureARB(...) erstetzt habe wird nur eine Textur verwendet ...