0

OpenGLを使用してiOSで簡単なテストを実行しようとしています(ES 2.0ですが、コアプロファイルを使用した通常のGL 3.5または基本的に固定パイプラインのない実装の場合は同じである必要があります):

すべてを正しくセットアップし (コンテキスト、シェーダー、mvl マトリックスなど)、VBO を使用して glDrawArrays を介して三角形を正常にレンダリングします。

- (void)loadActors
{           
            GLfloat triangle1[] = {
                -1.0, -2.0, 0.0,
                3.0, 0.0, 0.0,
                0.0, 1.5, 0.0
            };

            GLuint VBO;
            glGenBuffers(1, &VBO);

            glBindBuffer(GL_ARRAY_BUFFER, VBO);
            glBufferData(GL_ARRAY_BUFFER, sizeof(triangle1), triangle1, GL_STATIC_DRAW);
            glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*3, 0);
            glEnableVertexAttribArray(0);
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    glClearColor(1., 0., 0., 1.);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glUseProgram(_program);

    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
    glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);

    glDrawArrays(GL_TRIANGLES, 0, 3);
}

今、インデックスを有効にしようとしています。そこで、単に 0,1,2 を保持する別の (グローバル) 配列を作成し、それを使用して VBO にインデックスを付けようとします。そのようです:

- (void)loadActors
{ 
            GLfloat triangle1[] = {
                -1.0, -2.0, 0.0,
                3.0, 0.0, 0.0,
                0.0, 1.5, 0.0
            };

            indicesG = malloc(sizeof(GLuint)*3);
            indicesG[0] = 0;
            indicesG[1] = 1;
            indicesG[2] = 2;

            GLuint VBO[2];
            glGenBuffers(2, VBO);

            glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
            glBufferData(GL_ARRAY_BUFFER, sizeof(triangle1), triangle1, GL_STATIC_DRAW);
            glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*3, 0);
            glEnableVertexAttribArray(0);

            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBO[1]);
            glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indicesG), indicesG, GL_STATIC_DRAW);
}


- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    glClearColor(1., 0., 0., 1.);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


    glUseProgram(_program);

    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
    glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);

    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
}

インデックス配列は VBO の頂点 0、1、および 2 を呼び出すだけで、GL_ELEMENT_ARRAY_BUFFER を使用していない場合と同じ三角形になると思います。しかし、代わりに、何も描かれていないように見えます。

私は何が欠けていますか?

4

2 に答える 2

0

問題は、実際には、indexG 配列サイズの計算でした。やっていたし、やるsizeof(indicesG)べきだったsizeof(GLuint)*3

で動作しますglBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*3, indicesG, GL_STATIC_DRAW);

于 2012-09-27T00:35:05.100 に答える
0

3glDrawElements の最後の引数として0、インデックス VBO の先頭からカウントを開始する必要があるため、3 バイトではありません。

于 2012-09-26T23:57:26.210 に答える