2011-12-08 13 views
0

GLKitを使用してOpenGL for iPhoneを開始しました。私のプログラミングの背景は、ほぼ10年以上前のC、C++の経験はほとんどない、ほとんどJavaと客観的なものです。残っていることは、私がポインターで苦労したことの遠隔記憶であり、私は失敗したと思います。それはすべて私に戻ってくるかのようOpenGLが頂点ポインタを送信するか、バッファを生成する

は、今では、私は本当に私を助けたgreat, great tutorial series of Ian Terrelのいくつかの反復、に行ってきました

...そうです(感謝!!!)。

この質問(主に直接チュートリアルから取られる)コードの以下の部分についてです:

@interface AAAShape : NSObject 
{ 
    NSMutableData *vertexData; 
    // ... 
} 
@property(readonly) int vertexCount; 
@property(readonly) GLKVector2 *vertices; 
//...  
@end 

@implementation AAAShape 
//... 


-(GLKVector2 *)vertices 
{ 
    if(!vertexData) 
    { 
    vertexData = [NSMutableData dataWithLength:sizeof(GLKVector2)*self.vertexCount]; 
    } 
    return [vertexData mutableBytes]; 
} 

-(void)renderInScene:(AAAScene *)scene 
{ 
    //... Effect Stuff 
    //... 
    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, self.vertices); 
    //... 
} 
//... 
@end 

//Using the Shape: 
//(AATriangle is of AAAShape and implements the vertextCount with "return 3;")  
AAATriangle *triangle = [[AAATriangle alloc]init]; 

triangle.vertices[0] = GLKVector2Make(2., .0); 
triangle.vertices[1] = GLKVector2Make(-2., .0); 
triangle.vertices[2] = GLKVector2Make(.0, -3.); 
//... 

は、このすべてが本当にうまく動作しますが、その後、私はAppleのOpenGl Guideに次つまずきました:

[...]しかし、非効率的です。 DrawModelが呼び出されるたびに、インデックス と頂点データがOpenGL ESにコピーされ、 グラフィックハードウェアに転送されます。[...]パフォーマンスに影響を与える可能性があります。 [...]あなたのアプリケーション は、その頂点データを頂点バッファオブジェクト(VBO)に格納する必要があります。

void DrawModelUsingVertexBuffers() 
{ 
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
    glVertexAttribPointer(ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(vertexStruct), (void*)offsetof(vertexStruct,position)); 
    glEnableVertexAttribArray(ATTRIB_POSITION); 
    //... 
} 
:以降で描画

GLuint vertexBuffer; 
void CreateVertexBuffers() 
{ 

    glGenBuffers(1, &vertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

} 

とを:[...]

その(ほぼ同じ示す他のソース)を行うためのが提案のコードサンプルは、次のようになります

私はそれについていくつか質問があります:

  • マンスの影響?コードを変更する必要はありますか?
  • 何が... 本当には、上記の最初のコードサンプル(Ian's/my code)に続いていますか?
    • なぜ頂点が読み込み専用で、どこでどのように頂点にメモリが割り当てられるのかは、頂点[i]を設定できますか?私はイアンの/私のアプローチで(ものをバッファが作成および結合性)上記のコードを入れて、なぜ接続がない可能性があり
  • 結合との間で(変数の平均では、メソッド呼び出しか何かです)お絵かき?

答えて

2
  • 言及したパフォーマンスへの影響はどのように重要ですか?コードを変更する必要はありますか?

データが絶えず変化している場合は、VBOからほとんど得られません。しかし、ジオメトリが静的であれば、CPUとGPUの間の貴重な帯域幅を常にコピーしないように保存するので、大きな違いがあります。

  • 何...本当に上記の最初のコードサンプル(イアンさん/私のコード)で起こっていますか?

アレイには頂点データが埋め込まれています。次に、OpenGLのポインタがそのデータに設定されます。 glDraw ...が呼び出されると、ポインタは逆参照され、データはプロセスメモリからレンダリング側にフェッチされ、描画操作でそこで処理されます。

  • 頂点を設定することが可能であるのはなぜ[i]の頂点が読み取り専用の場合、どこで、どのようにメモリが頂点に割り当てられていますか?

ポインタのみが読み込み専用であるためです。それが指す変数は、/私はイアンの/私のアプローチでは(バッファの作成やものを - 結合)の上

glGenBuffersとglBufferDataを、コードを置くことができ

  • を読み書きされます頂点データの作成に進みます。 glVertexPointerはそれがどこにあるかはそのままです。両方のサイトでglBindBufferが使用されます。

    なぜ、バインディングと描画の間に(変数がメソッド呼び出しなのか、何かの意味で)何も接続されていないのですか?

    あなたはその質問の意味を理解しています。

関連する問題