zur Zeit habe ich Probleme eine Struktur mit den Eckpunkten für ein Mesh-Füllung (Screen Quad Befüllung mit hohen Auflösung)Wie ein Struct rechts mit Ecken und Indexpuffern für OpenGL ES
Dies ist die Struktur:
typedef struct {
float Position[3];
float Color[4];
float TexCoord[2];
}Vertex;
Normalerweise würde ich es nur mit per Hand ausfüllen, zB
const Vertex Vertices[]= {
{{1,-1,0},{1,0,0,1},{1,1}},
{{1,1,0},{0,1,0,1},{1,0}},
{{-1,1,0},{0,0,1,1},{0,0}},
{{-1,-1,0},{0,0,0,1},{0,1}}
};
und binden diese zu meinen Buffer usw.
Da ich ein Mesh mit viel höherer Auflösung brauche (11x11 mesh, das ich per Hand ausgefüllt habe, war nicht genug) dachte ich daran, dies mit dieser Methode zu füllen.
- (void) createMesh : (int) width withHeight: (int)height{
int size = width * height + height +1;
Vertex Vert[]; //since we will be adding a vertex at the end for the (1,y), (1,v) and the x u
int sizeInd = width * height * 2 * 3;
GLubyte Ind[sizeInd]; // width * height * 2 number triangles, 3 indices per triangle
float x,y,u,v;
int count = 0;
// Fill Vertices
for (int i = 0 ; i <= height ; i++){
y = ((1.0 - i/height) * -1.0) + ((i/height) * 1.0);
v = 1.0 - (float) i/(float) height;
for (int j = 0; j <= width; j++){
x = (float) j/(float) width;
u = x; //(float) j/ (float) count;
//Vert[count]= {{x,y,0},{0,0,0,1.0},{u,v}};
Vert[count].Position[0] = x;
Vert[count].Position[1] = y;
Vert[count].Position[2] = 0;
Vert[count].Color[0] = 0.0;
Vert[count].Color[1] = 0.0;
Vert[count].Color[2] = 0.0;
Vert[count].Color[3] = 1.0;
Vert[count].TexCoord[0] = u;
Vert[count].TexCoord[1] = v;
count++;
}
}
//Fill indices
count = 0;
for (int c = 0; c < sizeInd; c++){
Ind[c] = count;
c++;
Ind[c] = count + 1;
c++;
Ind[c] = count + width + 1 + 1;
c++;
Ind[c] = count + 1;
c++;
Ind[c] = count + width + 1 + 1 + 1;
c++;
Ind[c] = count + width + 1 + 1;
count++;
}
//Fill buffer
glGenBuffers(1,&_vertexMeshBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vert), Vert, GL_STATIC_DRAW);
glGenBuffers(1, &_indexMeshBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Ind), Ind, GL_STATIC_DRAW);
}
in meiner Render-Methode i ziehen über
glDrawElements(GL_TRIANGLES, (sizeof(GLubyte)* width * height * 2 * 3/sizeof(GLubyte))/*sizeof(Ind)/sizeof(Ind[0])*/,
GL_UNSIGNED_BYTE, 0);
da die GLubyte Ind nicht außerhalb der Funktion existieren, kann ich nicht die Größe über
sizeof(Ind)/sizeof(Ind[0])
wie ich bekommen würde normalerweise tun.
Also, ist das der richtige Weg, um eine Struktur zu füllen, oder muss ich das irgendwie anders machen? Dieser Ansatz scheint mir richtig zu sein, aber das könnte auch wegen meines Mangels an sachgemäßem c Wissen in diesem Fall sein
gerade stürzt meine App beim Start, beim Anschließen der erforderlichen Hardware, so dass es möglicherweise nur ein Problem gibt mit der Speicherzuweisung.
Oder hat jemand Informationen darüber, wie man ein Netz mit höherer Auflösung in Ziel-C/Opengles richtig einrichtet?
Ich habe bereits einen Diamant-Schritt-Algorithmus in C++ implementiert, und ich weiß, dass dieser Ansatz nicht perfekt codiert ist, ich habe nur die Anrufe für meinen persönlichen Gebrauch vereinfacht.
Dies ist mehr über die ordnungsgemäße Verwendung des Strukturtyps in Kombination mit den passenden Gles Calls.
jede Hilfe ist willkommen.
EDIT:
Es gibt ein paar Dinge falsch mit meiner automatischen Indizes waren, vor allem vergaß ich zum nächsten am Ende einer Zeile zu springen, da ich, dass er letzte Element einer Reihe Ameise nicht sein, um einen Startpunkt des nächsten Dreiecks-Block
Dies sollte richtig sein:
//Fill indices
count = 0;
int jumpBarrier = 1;
for (int c = 0; c < sizeInd; c++){
Ind[c] = count;
c++;
Ind[c] = count + 1;
c++;
Ind[c] = count + width + 1; //; + 1;
c++;
Ind[c] = count + 1;
c++;
Ind[c] = count + width + 1 + 1;// + 1;
c++;
Ind[c] = count + width + 1 ;//+ 1;
//jump
if (jumpBarrier == width){
count++;
count++;
jumpBarrier = 1;
}
else{
count++;
jumpBarrier++;
}
}
EDIT # 2
duh, innere For-Schleife inkrementiert i statt j, behoben, dass Vertices und Indizes jetzt genau so erzeugt werden, wie sie sein sollten.
EDIT # 3
So gelang es mir, unter Verwendung einer Modifikation dieses Algorithmus nur, um dieses Problem zu bekommen, um alles in eine Textdatei zu drucken und dann in meinem Projekt zu kopieren alles, wo ich sie brauche.
Wenn jemand immer noch erklären möchte, wo ich etwas falsch gemacht habe und wie man diese Struktur richtig füllt, können Sie diese Frage gerne beantworten, um weitere Informationen zu erhalten.
Danke für solch eine detaillierte Antwort! Kurz gesagt: Man muss Speicher manuell mit malloc zuweisen, anstatt ein Array mit einer bestimmten Größe zu erstellen, und dann erzeugte Strukturen/Elemente an die richtige Stelle schieben. – seko
Die Zuweisung selbst macht wenig Unterschied. Im Allgemeinen können Sie statische Arrays verwenden, wenn die Arrays klein genug sind und die Anzahl der Scheitelpunkte fest ist. Sonst ist die explizite Speicherzuweisung eine Verbesserung der Performance und der Stabilität, und da es praktisch keinen Nachteil gibt, wenn man sie in objectiveC verwendet, schlage ich vor, sie zu verwenden. Eine andere Möglichkeit besteht darin, NSData oder seine veränderbare Version zu verwenden, die praktisch dasselbe tut, aber bereits in objectiveC eingebettet ist, so dass der Speicher nicht freigegeben werden muss, da er von der ARC gehandhabt wird. Sie können etwas wie Vertex * vertexBuffer = (Vertex *) [Datenbytes] verwenden –