actuellement j'ai des problèmes de remplissage d'un struct avec des sommets pour un maillage (écran de remplissage Quad avec une haute résolution)Comment remplir un droit Struct avec des sommets et tampon d'index pour openGL ES
C'est le struct:
typedef struct {
float Position[3];
float Color[4];
float TexCoord[2];
}Vertex;
Normalement, je voudrais juste le remplir avec par main, par exemple
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}}
};
et se lier à mon tampon, etc.
Depuis que j'ai besoin d'un Mesh avec une résolution beaucoup plus élevée (11x11 mesh que je remplis à la main ne suffisait pas) j'ai pensé à Remplir ceci via cette méthode.
- (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);
}
dans ma méthode render je dessine via
glDrawElements(GL_TRIANGLES, (sizeof(GLubyte)* width * height * 2 * 3/sizeof(GLubyte))/*sizeof(Ind)/sizeof(Ind[0])*/,
GL_UNSIGNED_BYTE, 0);
depuis le GLubyte Ind n'existe pas en dehors de la fonction, je ne peux pas obtenir la taille via
sizeof(Ind)/sizeof(Ind[0])
comme i ferait normalement.
Alors, est-ce la bonne façon de remplir une structure ou est-ce que je dois le faire d'une autre manière? Cette approche me semble juste, mais cela pourrait aussi être à cause de mon manque de connaissance objective objective c dans ce cas
maintenant, mon application se bloque au démarrage, lors de la connexion du matériel requis, donc il pourrait y avoir un problème avec l'allocation de mémoire.
Ou est-ce que quelqu'un a des informations sur la façon de configurer correctement un maillage de plus haute résolution dans les objectifs c/opengl?
J'ai déjà implémenté un algorithme en pas à pas en C++, et je sais que cette approche n'est pas parfaitement codée, je viens de simplifier les appels pour mon usage personnel.
Il s'agit davantage de l'utilisation correcte du type struct en combinaison avec les appels gles correspondants.
toute aide est la bienvenue.
EDIT:
Il y avait quelques choses de mal à mes indices automatiques, principalement j'ai oublié de sauter à la fin d'une ligne à l'autre, puisque je ne fourmi pas qu'il dernier élément d'une rangée être un point de départ du prochain triangle bloc
Cela devrait être bon:
//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, interne for-loop incrémenté i au lieu de j, fixé que, vertices et les index sont maintenant créés comme ils devraient être.
EDIT # 3
Je réussi à contourner ce problème en utilisant une modification de cet algorithme pour imprimer uniquement tout dans un fichier texte, puis tout copier dans mon projet où je les ai besoin.
Si quelqu'un veut toujours expliquer où j'ai fait quelque chose de mal et comment remplir réellement ce droit struct, vous êtes invités à répondre à cette question pour d'autres apprentissages.
Merci pour cette réponse détaillée! Donc, en bref: il faut allouer de la mémoire manuellement avec malloc au lieu de créer un tableau avec une taille spécifique, et ensuite pousser les structures/éléments créés au bon endroit. – seko
La répartition elle-même fait peu de différence. En général, vous pouvez utiliser des tableaux statiques si les tableaux sont suffisamment petits et si le nombre de sommets est fixe. Sinon, l'allocation explicite de la mémoire est un gain de performance et de stabilité et comme il n'y a pratiquement aucun inconvénient à l'utiliser dans l'objectif, je vous suggère de l'utiliser. Une autre façon est d'utiliser NSData ou sa version mutable qui fait à peu près la même chose mais qui est déjà enveloppée dans objectiveC, il n'est donc pas nécessaire de libérer la mémoire car elle sera gérée par l'ARC. Vous pouvez utiliser quelque chose comme Vertex * vertexBuffer = (Vertex *) [octets de données] –