私はOpenGL ES 1.1を使用してiPhoneゲームを開発しています。パフォーマンスが低下することなく500以上のパーティクルをレンダリングするには、頂点バッファオブジェクトを使用する必要があります。OpenGL ES 1.1頂点バッファオブジェクトが動作しない
私のゲームはVBO以外の方法を使って正常に描画できましたが、今ではVBOを組み込もうとしましたが、もう何も描画されません。
私が間違っていることを特定し、正しい例を挙げてください。
私は次のように構成さTexturedQuadというクラスがあります。TexturedQuad.mで
// TexturedQuad.h
enum {
ATTRIB_POSITION,
ATTRIB_TEXTURE_COORD
};
@interface TexturedQuad : NSObject {
GLfloat *textureCoords; // 8 elements for 4 points (u and v)
GLfloat *vertices; // 8 elements for 4 points (x and y)
GLubyte *indices; // how many elements does this need?
// vertex buffer array IDs generated using glGenBuffers(..)
GLuint vertexBufferID;
GLuint textureCoordBufferID;
GLuint indexBufferID;
// ...other ivars
}
// @synthesize in .m file for each property
@property (nonatomic, readwrite) GLfloat *textureCoords;
@property (nonatomic, readwrite) GLfloat *vertices;
@property (nonatomic, readwrite) GLubyte *indices;
@property (nonatomic, readwrite) GLuint vertexBufferID;
@property (nonatomic, readwrite) GLuint textureCoordBufferID;
@property (nonatomic, readwrite) GLuint indexBufferID;
// vertex buffer object methods
- (void) createVertexBuffers;
- (void) createTextureCoordBuffers;
- (void) createIndexBuffer;
を、頂点バッファが作成されます。VBOの作成方法上記
- (void) createVertexBuffers {
glGenBuffers(1, &vertexBufferID);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
}
- (void) createTextureCoordBuffers {
glGenBuffers(1, &textureCoordBufferID);
glBindBuffer(GL_ARRAY_BUFFER, textureCoordBufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(textureCoords), textureCoords, GL_STATIC_DRAW);
}
- (void) createIndexBuffer {
glGenBuffers(1, &indexBufferID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLubyte) * 16, indices, GL_STATIC_DRAW);
}
各TexturedQuadインスタンスを初期化するカスタムクラスAtlasLibraryクラスによって呼び出されます。
まず、頂点を次の形式で配置されている:
:// bottom left
quad.vertices[0] = xMin;
quad.vertices[1] = yMin;
// bottom right
quad.vertices[2] = xMax;
quad.vertices[3] = yMin;
// top left
quad.vertices[4] = xMin;
quad.vertices[5] = yMax;
// top right
quad.vertices[6] = xMax;
quad.vertices[7] = yMax;
は第二に、テクスチャ座標は以下の形式(鏡像ためのOpenGL ESの傾向を考慮して反転)に配置されています ...次、VBO-作成方法は、(AtlasLibraryに)と呼ばれている
// top left (of texture)
quad.textureCoords[0] = uMin;
quad.textureCoords[1] = vMax;
// top right
quad.textureCoords[2] = uMax;
quad.textureCoords[3] = vMax;
// bottom left
quad.textureCoords[4] = uMin;
quad.textureCoords[5] = vMin;
// bottom right
quad.textureCoords[6] = uMax;
quad.textureCoords[7] = vMin;
[quad createVertexBuffers];
[quad createTextureCoordBuffers];
[quad createIndexBuffer];
今や肉とジャガイモです。 SceneObjectクラス。 SceneObjectsはレンダリング可能なオブジェクトです。それらはTexturedQuadインスタンスを参照し、回転、変換、およびスケールに関する情報を含みます。
- (void) render {
// binds texture in OpenGL ES if not already bound
[[AtlasLibrary sharedAtlasLibrary] ensureContainingTextureAtlasIsBoundInOpenGLES:self.containingAtlasKey];
glPushMatrix();
glTranslatef(translation.x, translation.y, translation.z);
glRotatef(rotation.x, 1, 0, 0);
glRotatef(rotation.y, 0, 1, 0);
glRotatef(rotation.z, 0, 0, 1);
glScalef(scale.x, scale.y, scale.z);
// change alpha
glColor4f(1.0, 1.0, 1.0, alpha);
// vertices
glBindBuffer(GL_ARRAY_BUFFER, texturedQuad.vertexBufferID);
glVertexAttribPointer(ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT), &texturedQuad.vertices[0]);
// texture coords
glBindBuffer(GL_ARRAY_BUFFER, texturedQuad.textureCoordBufferID);
glVertexAttribPointer(ATTRIB_TEXTURE_COORD, 2, GL_FLOAT, GL_FALSE, sizeof(GL_FLOAT), &texturedQuad.textureCoords[0]);
// bind index buffer array
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, texturedQuad.indexBufferID);
// draw
glDrawElements(GL_TRIANGLE_STRIP, sizeof(texturedQuad.indices)/sizeof(texturedQuad.indices[0]), GL_UNSIGNED_BYTE, texturedQuad.indices);
glPopMatrix();
}
私は私のインデックスの配列が誤って構成されていること、またはglDrawElements(..)関数が誤って呼び出されたという強い気持ちを持っている:ここでは
はシーンオブジェクトにメソッドをレンダリングしています。
この質問に答えるために、してください:
- は、私は、OpenGL ESは私SceneObjectsを描画しないように引き起こすこと間違ってやっているものを識別します。
- 私は(私のフレームワークに基づいてください)やろうとしています何をする正しい方法を提供
- (オプション)そんなに
感謝を助けるかもしれない任意の提案やリンクを提供!
いいえ、テクスチャが正常に読み込まれています。 glBindTextureの呼び出しは、メソッド [[AtlasLibrary sharedAtlasLibrary] ensureContainingTextureAtlasIsBoundInOpenGLES:self.containingAtlasKey]で行われます。 私はVBOを使ってみる前にそれが動作していたので、その部分が動作していることを知っています。そのため、テクスチャの読み込みとバインディングが機能しています。 – BigSauce
私は(私は窓を閉ざされたような愚かな何かをした)と答えたと断言できましたか? IIRC私の反応は、頂点はポインタなので、sizeof(頂点)が4であるという事実がありました。ポインタの代わりに 'glVertexAttribPointer'を呼び出すと、バッファにオフセットが与えられます。私はあなたのコードを比較できるリンクも提供しましたが、今のところ何のことも全く考えていません。 12月28日の私の歴史で判断すると、[VBO - just examples](http://www.opengl.org/wiki/VBO_-just_examples)されている可能性があります。 –