2011-12-18 22 views
4

私は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を描画しないように引き起こすこと間違ってやっているものを識別します。
  • 私は(私のフレームワークに基づいてください)やろうとしています何をする正しい方法を提供
  • (オプション)そんなに

感謝を助けるかもしれない任意の提案やリンクを提供!

答えて

0

何かが欠落していない限り、テクスチャはどこにロードされていますか?あなたはテクスチャ座標を設定していますが、glBindTextureは表示されません。また、alphaが有効な値であると仮定しています。

は、すなわち9-1、およびこのOpenGL ES VBO tutorialリストからApple OpenGL ES VBO article,を参照してください。

+0

いいえ、テクスチャが正常に読み込まれています。 glBindTextureの呼び出しは、メソッド [[AtlasLibrary sharedAtlasLibrary] ensureContainingTextureAtlasIsBoundInOpenGLES:self.containingAtlasKey]で行われます。 私はVBOを使ってみる前にそれが動作していたので、その部分が動作していることを知っています。そのため、テクスチャの読み込みとバインディングが機能しています。 – BigSauce

+0

私は(私は窓を閉ざされたような愚かな何かをした)と答えたと断言できましたか? IIRC私の反応は、頂点はポインタなので、sizeof(頂点)が4であるという事実がありました。ポインタの代わりに 'glVertexAttribPointer'を呼び出すと、バッファにオフセットが与えられます。私はあなたのコードを比較できるリンクも提供しましたが、今のところ何のことも全く考えていません。 12月28日の私の歴史で判断すると、[VBO - just examples](http://www.opengl.org/wiki/VBO_-just_examples)されている可能性があります。 –

1

私は、OpenGLとOpenGL ESとの違いに経験していないんだけど、私はあなたのコードでglEnableVertexAttribArray()への呼び出しが表示されません。

機能はOpenGL ES 1.1 docsで疑わしい存在しないが、2.0であり、Apple's OpenGL ES VBO article(おかげJSPerfUnkn0wn)で使用されています。

Vertex Buffer ObjectsIndex Buffer Objectsに関するその他の良い(ただしES以外の)チュートリアルがあります。

関連する問題