Streifen zu Dreiecken
-
Hallo ,
ich erzeuge eine Netz indem ich eine X Y Schleife durchlaufe, und
mittels TRIANGLE_STRIP Spaltenweise 2 Vertice angebe.int m_Width(1600),m_Height(1200); for(register WORD y(0); y < m_height-1; y++) { glBegin(GL_TRIANGLE_STRIP); for(register WORD x(0);x < m_width; x++) { glTexCoord2f((float)x/m_width,(float)y+1/m_height); glVertex3f(x,startY - y+1, 0); glTexCoord2f((float)x/m_width,(float)y/m_height); glVertex3f(x,y, 0); } glEnd(); }
Ich möchte nun aber keine Strips erzeugen, sondern GL_TRIANGLES.
Frage: Wie müßte man den Generator umschreiben ?
Danke für Hinweise,
-
Selbst antwort, gut triangle vs strip, selbst via index ist es dennoch derbe langsamer.. ca 4 mal ^^
for(y=0; y < m_height-step; y+=step) for(x=0;x < m_width; x+=step) { m_size+=6; //--------------- TRIANGLES ---------------------- float h0=GetHVal(x,y); CVertex tv0((float)x/m_width,(float)y/m_height,0.f); *pTVptr++ = tv0; CVertex v0((float)startX + x,(float)startY - y,h0); *pVptr++ = v0; float h1=GetHVal(x,y+step); CVertex tv1((float)x/m_width,(float)(y+step)/m_height,0.f); *pTVptr++ = tv1; CVertex v1((float)startX + x,(float)startY - (y+step),h1); *pVptr++ = v1; float h2=GetHVal((x+step),y); CVertex tv2((float)(x+step)/m_width,(float)y/m_height,0.f); *pTVptr++ = tv2; CVertex v2((float)startX + (x+step),(float)startY - y,h2); *pVptr++ = v2; *pTVptr++ = tv2; *pVptr++ = v2; *pTVptr++ = tv1; *pVptr++ = v1; float h3=GetHVal((x+step),(y+step)); CVertex tv3((float)(x+step)/m_width,(float)(y+step)/m_height,0.f); *pTVptr++ = tv3; CVertex v3((float)startX + (x+step),(float)startY - (y+step),h3); *pVptr++ = v3; }
-
Karsten Schulz schrieb:
Selbst antwort, gut triangle vs strip, selbst via index ist es dennoch derbe langsamer.. ca 4 mal ^^
Kein Wunder, Du erzeugst ja jetzt 6 Vertices wo Du vorher nur 2 brauchtest.
Sinnvoller waere jeden Vertex nur 1x zu erzeugen und zusaetzlich einen Indexbuffer anzulegen, der pro Triangle nur die Ids der verwendeten Vertices speichert.
-
Ja Danke Dir für den Hinweis,
ich habe inzwischen einen fast perfekten Generator, derdie indextabelle
gleich miterzeugt, im Moment bin ich schon am LOD Manager, und handtiere
mit abgeleiteten Indextabellen.Der Generator schaut nun so aus:
DWORD CTerrain::MakeTriangle(void) { register GLuint *pIdx(m_pIdx),Off; for(register WORD y(0); y < m_height; y++) for(register WORD x(0); x < m_width; x++) { Off = y * m_width + x; m_pTVert[Off].u = (float)x/m_width; m_pTVert[Off].v = (float)y/m_height; m_pVert[Off].y = (float)y-(m_width>>1); m_pVert[Off].x = (float)x-(m_height>>1); m_pVert[Off].z = GetHVal(x,y); if(y<m_height-1 && x<m_width-1) { *pIdx++ = Off; *pIdx++ = Off+m_width; *pIdx++ = Off + 1; *pIdx++ = Off+m_width; *pIdx++ = Off+m_width + 1; *pIdx++ = Off + 1; } } return pIdx-m_pIdx; }