0

私はopengles2にかなり慣れていません。また、IOSアプリをコーディングしているので、試してみようと思いました。そこで、xcode 4のGLKitテンプレートを使用してデフォルトのopenglプログラムをロードし、提供されたコードをいじくり回した後、複数の異なる種類の頂点配列オブジェクトを描画できるように変更を開始しました...問題はglClearColorの呼び出しだけです結果が出るようです-画面全体が灰色になりました:-(コードの重要な場所で多くのglGetError呼び出しをチェックしたので、何が悪いのかわかりませんが、常に0を返すようです...そして私も、私の知識の範囲内で、VAOを使用して描画するために必要な手順に従ってください。最初にデフォルトのコードを変更して平面を表示したときは、問題なく機能しました。初心者!:)

コードのさまざまな関連部分の投稿は次のとおりです。

//init VAOs:
glGenVertexArraysOES(NUM_VAO, _vertexArrayIDS);
glGenBuffers(NUM_VAO, _vertexBufferIDS);
glGenBuffers(NUM_VAO, _indexBufferIDS);

//init gl object for player:
//setupGLObject(VAO_PLAYER, gCubicVertexData, gCubicIndices, GL_STATIC_DRAW);   
glBindVertexArrayOES(_vertexArrayIDS[VAO_PLAYER]);

glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferIDS[VAO_PLAYER]);
glBufferData(GL_ARRAY_BUFFER, sizeof(gCubicVertexData), gCubicVertexData, GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBufferIDS[VAO_PLAYER]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(gCubicIndices), gCubicIndices, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribColor, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), BUFFER_OFFSET(12));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), BUFFER_OFFSET(24));

//NSLog(@"glError after player init : %d", glGetError());
//init gl object for player wall:
//setupGLObject(VAO_PWALL, gPlayerWallVertexData, gPlayerWallIndices, GL_DYNAMIC_DRAW);
glBindVertexArrayOES(_vertexArrayIDS[VAO_PWALL]);

glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferIDS[VAO_PWALL]);
glBufferData(GL_ARRAY_BUFFER, sizeof(gPlayerWallVertexData), gPlayerWallVertexData, GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBufferIDS[VAO_PLAYER]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(gPlayerWallIndices), gPlayerWallIndices, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribColor, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), BUFFER_OFFSET(12));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), BUFFER_OFFSET(24));

//init gl object for wall/floor plane:
//setupGLObject(VAO_WALL_FLOOR_PLANE, gPlanePyVertexData, gPlanePyIndices, GL_STATIC_DRAW);
glBindVertexArrayOES(_vertexArrayIDS[VAO_WALL_FLOOR_PLANE]);

glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferIDS[VAO_WALL_FLOOR_PLANE]);
glBufferData(GL_ARRAY_BUFFER, sizeof(gPlanePyVertexData), gPlanePyVertexData, GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBufferIDS[VAO_PLAYER]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(gPlanePyIndices), gPlanePyIndices, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribColor, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), BUFFER_OFFSET(12));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), BUFFER_OFFSET(24));

glBindVertexArrayOES(0);

描画関数-glkView:(GLKView *)view drawInRect:(CGRect)rect

for (NSString *currentKey in g_renderables) {
    GameObject *currentRenderable = [g_renderables objectForKey:currentKey];

    if (currentRenderable.go_type == LC_FLOOR) {
        glBindVertexArrayOES(_vertexArrayIDS[VAO_WALL_FLOOR_PLANE]);

        glUseProgram(_program);

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

        NSLog(@"glError : %d", glGetError());

        glDrawElements(GL_TRIANGLE_STRIP, sizeof(gPlanePyIndices)/sizeof(gPlanePyIndices[0]), GL_UNSIGNED_INT, 0);
    }
    else if (currentRenderable.go_type == LC_WALL) {
        glBindVertexArrayOES(_vertexArrayIDS[VAO_WALL_FLOOR_PLANE]);

        glUseProgram(_program);

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

        glDrawElements(GL_TRIANGLE_STRIP, sizeof(gPlanePyIndices)/sizeof(gPlanePyIndices[0]), GL_UNSIGNED_INT, 0);
    }
    else if (currentRenderable.go_type == LC_PLAYER) {
        glBindVertexArrayOES(_vertexArrayIDS[VAO_PLAYER]);

        glUseProgram(_program);

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

        glDrawElements(GL_TRIANGLE_STRIP, sizeof(gCubicIndices)/sizeof(gCubicIndices[0]), GL_UNSIGNED_INT, 0);
    }

マトリックス計算:

float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 1000.0f);


for (NSString *currentKey in g_renderables) {
    GLKMatrix4 thisMvm = GLKMatrix4Identity;
    GameObject *currentRenderable = [g_renderables objectForKey:currentKey];

    if (currentRenderable.go_hasVisual) {

        thisMvm = GLKMatrix4Translate(thisMvm, currentRenderable.go_origin.x, currentRenderable.go_origin.y, currentRenderable.go_origin.z);
        if (currentRenderable.go_type == LC_WALL || currentRenderable.go_type == LC_PLAYER) {
            if (currentRenderable.go_type == LC_PLAYER) {
                if (currentRenderable.go_orientation == VV_MINUS_X) {
                    thisMvm = GLKMatrix4RotateY(thisMvm, GLKMathDegreesToRadians(90.0f));
                }
                else if (currentRenderable.go_orientation == VV_PLUS_X) {
                    thisMvm = GLKMatrix4RotateY(thisMvm, GLKMathDegreesToRadians(-90.0f));
                }
                else if (currentRenderable.go_orientation == VV_PLUS_Z) {
                    thisMvm = GLKMatrix4RotateY(thisMvm, GLKMathDegreesToRadians(180.0f));
                }
            }
            else {
                if (currentRenderable.go_orientation == VV_MINUS_X) {
                    thisMvm = GLKMatrix4RotateZ(thisMvm, GLKMathDegreesToRadians(90.0f));
                }
                else if (currentRenderable.go_orientation == VV_PLUS_X) {
                    thisMvm = GLKMatrix4RotateZ(thisMvm, GLKMathDegreesToRadians(-90.0f));
                }
                else if (currentRenderable.go_orientation == VV_PLUS_Z) {
                    thisMvm = GLKMatrix4RotateX(thisMvm, GLKMathDegreesToRadians(-90.0f));
                }
                else if (currentRenderable.go_orientation == VV_MINUS_Z) {
                    thisMvm = GLKMatrix4RotateX(thisMvm, GLKMathDegreesToRadians(90.0f));
                }
            }
        }
        if (currentRenderable.go_type != LC_LINKED_WALL) thisMvm = GLKMatrix4Scale(thisMvm, currentRenderable.width, currentRenderable.height, currentRenderable.depth);
        thisMvm = GLKMatrix4Multiply(GLKMatrix4MakeLookAt(g_currentCam.go_origin.x, g_currentCam.go_origin.y, g_currentCam.go_origin.z, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f), thisMvm);
        //NSLog(@"%f", thisMvm.m[10]);
        thisMvm = GLKMatrix4Multiply(projectionMatrix, thisMvm);

        currentRenderable.go_mvm = thisMvm;

    }
}

それだけです。助けてください!!!

4

1 に答える 1

0

glclearcolor の理解の仕方に少し混乱があると思います。

主なアイデアは、すべてのフレームについて、glclear を実行して少なくともカラー ビットをクリアする必要があるということです。これは、描画を行った後にボードをクリーニングするようなものです。

glclearcolor は代わりに、クリア後に画面全体に使用する色を OpenGL に指示します。

これの例は次のとおりです。

glClearColor(1.0f,0.0f,0.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

この例では、color_buffer_bit のクリアの色が必要な場合に、OpenGL に赤色を使用するように指示しています。

これが何らかの形で役立つことを願っています。

于 2012-04-11T14:28:19.147 に答える