現在私が持っているメッシュの頂点を持つ構造体を埋める問題(画面が高解像度でクワッドを充填)のOpenGL ESのための頂点とインデックスバッファを持つ構造体の右側を埋める方法
これは構造体である:
typedef struct {
float Position[3];
float Color[4];
float TexCoord[2];
}Vertex;
通常、私はちょうど
など、手あたりでそれを埋める例えば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}}
};
と私のバッファにこれを結合します
もっと高い解像度のメッシュが必要なので(11x11メッシュで十分ではありませんでした)、私はこの方法でこれを埋め込むことを考えました。私のrenderメソッドで
- (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);
}
iはGLubyte工業は、関数の外に存在しないため、私は、私のような
sizeof(Ind)/sizeof(Ind[0])
を経由してサイズを取得することはできません
glDrawElements(GL_TRIANGLES, (sizeof(GLubyte)* width * height * 2 * 3/sizeof(GLubyte))/*sizeof(Ind)/sizeof(Ind[0])*/,
GL_UNSIGNED_BYTE, 0);
を経由して描きます通常はやります。
これは構造体を埋める正しい方法ですか、それとも何とか他の方法で行う必要がありますか?このアプローチは私にとっては正しいと思われますが、これは私の適切な客観的知識が不足しているためでもあります。
今、私のアプリは、必要なハードウェアを接続するときにクラッシュするので、メモリ割り当てを伴う。
また、目的のc/openglで高解像度のメッシュを正しく設定する方法についての情報はありますか?
私はすでにC++でダイヤモンドステップアルゴリズムを実装していますが、このアプローチが完全にコーディングされていないことを知っています。
これは、一致するgles呼び出しと組み合わせてstruct型を適切に使用する方法の詳細です。
何か援助を歓迎します。
EDIT:いくつかのことが私の自動インデックスと間違っていた
、主に私は、行の彼の最後の要素をアリないので、次の行の最後にジャンプするのを忘れました次の三角形ブロックの出発点であることが
これは右でなければならない:
//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、forループ内でiを増やしてjの代わりに増やした場合、 頂点とインデックスが作成されるようになりました。
EDIT#3
だから私は単なるテキストファイル内のすべてを印刷するには、このアルゴリズムの変更を使用して、その後、私はそれらを必要とする私のプロジェクトのすべてをコピーすることによってこの問題を回避するために管理。
もし誰かが何か間違ったことをしたがって、この構造体の権利を実際に埋める方法を説明したいのであれば、この質問に答えて歓迎します。あなたのメッシュの作成について
このような詳細な回答ありがとうございます!したがって、要するに:特定のサイズの配列を作成する代わりにmallocを使って手動でメモリを割り当て、作成した構造体/要素を正しい場所にプッシュする必要があります。 – seko
割り当て自体はほとんど違いがありません。一般に、配列が十分に小さく、頂点の数が固定されている場合は、静的配列を使用できます。それ以外の場合、明示的なメモリ割り当てはパフォーマンスと安定性の向上であり、目的を達成するための欠点はほとんどありませんので、使用することをお勧めします。もう1つの方法は、NSDataまたはその可変バージョンを使用することです。これはほぼ同じことですが、既にobjectiveCでラップされているため、ARCによって処理されるようにメモリを解放する必要はありません。 Vertex * vertexBuffer =(Vertex *)[data bytes]のようなものを使うことができます。 –