0

OpenGL プロジェクトで GLKit を使用しています。すべてが GLKView と GLKBaseEffect に基づいています (カスタム シェーダーはありません)。私のプロジェクトでは、3D オブジェクトを表示するための GLKViews を持ついくつかのビューがあり、それらのビューのいくつかを一度に「開く」ことができます (つまり、モーダル ビュー スタックにあります)。

これまではすべて問題なく機能していましたが、作成中の新しいビューでは、アプリの 3D ワールドの測定テープをシミュレートするテクスチャ付きの長方形が必要でした。なんらかの理由で、そのビューのみで、テクスチャは opengl コンテキストに正しく読み込まれません: テクスチャは GLKTextureLoader によって正しく読み込まれますが、長方形を描画すると黒になり、デバッグで OpenGL フレームを見るとわかります。空のテクスチャがロードされていること (テクスチャへの参照がありますが、すべてゼロまたは null になっています)。

私が描いている形状は次のように定義されています: (元々は三角形のストリップでしたが、問題がないことを確認するために三角形に切り替えました)

static const GLfloat initTape[] = {
    -TAPE_WIDTH / 2.0f, 0, 0,
    TAPE_WIDTH / 2.0f, 0, 0,
    -TAPE_WIDTH / 2.0f, TAPE_INIT_LENGTH, 0,

    TAPE_WIDTH / 2.0f, 0, 0,
    TAPE_WIDTH / 2.0f, TAPE_INIT_LENGTH, 0,
    -TAPE_WIDTH / 2.0f, TAPE_INIT_LENGTH, 0,
};
static const GLfloat initTapeTex[] = {
    0, 0,
    1, 0,
    0, 1.0,

    1, 0,
    1, 1,
    0, 1,
};

効果変数を次のように設定します。

    effect.transform.modelviewMatrix = modelview;
    effect.light0.enabled = GL_FALSE;

    // Projection setup
    GLfloat ratio = self.view.bounds.size.width/self.view.bounds.size.height;
    GLKMatrix4 projection = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(self.fov), ratio, 0.1f, 1000.0f);
    effect.transform.projectionMatrix = projection;


    // Set the color of the wireframe.
    if (tapeTex == nil) {
        NSError* error;
        tapeTex = [GLKTextureLoader textureWithContentsOfFile:[[[NSBundle mainBundle] URLForResource:@"ruler_texture" withExtension:@"png"] path] options:nil error:&error];
    }
    effect.texture2d0.enabled = GL_TRUE;
    effect.texture2d0.target = GLKTextureTarget2D;
    effect.texture2d0.envMode = GLKTextureEnvModeReplace;
    effect.texture2d0.name = tapeTex.name;

レンダリング ループは次のとおりです。

       [effect prepareToDraw];
        glDisable(GL_DEPTH_TEST);
        glDisable(GL_CULL_FACE);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glEnable(GL_BLEND);
        glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
        glEnableVertexAttribArray(GLKVertexAttribPosition);
        glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
        glVertexAttribPointer(GLKVertexAttribPosition, COORDS, GL_FLOAT, GL_FALSE, 0, tapeVerts);
        glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, tapeTexCoord);

        glDrawArrays(GL_TRIANGLES, 0, TAPE_VERTS);

        glDisableVertexAttribArray(GLKVertexAttribPosition);
        glDisableVertexAttribArray(GLKVertexAttribTexCoord0);

また、他のオブジェクトを使用して別のビューでテクスチャ自体をテストしたところ、正常に動作するため、テクスチャ ファイルの障害ではありません。

この問題で 3 日以上立ち往生しているため、どんな助けも大歓迎です。

更新: また、レンダリング ループ中に glErrors はありません。

4

2 に答える 2

3

何日も経って、ようやく自分の間違いを見つけました。複数の openGL コンテキストを使用する場合、shareGroup を使用して GLKTextureLoader を作成することが重要です。そうしないと、テクスチャが必ずしも正しいコンテキストに読み込まれません。

クラス メソッド textureWithContentOf を使用する代わりに、すべてのコンテキストは context.sharegroup で初期化された独自の GLKTextureLoader を必要とし、そのビューにはそのテクスチャ ローダーのみを使用します。(実際、テクスチャは異なるコンテキスト間で保存できますが、共有グループのその機能は必要ありませんでした)。

于 2012-09-09T15:03:53.820 に答える
0

簡単なチュートリアルhttp://games.ianterrell.com/how-to-texturize-objects-with-glkit/ 役立つと思います。

于 2012-09-02T13:53:02.973 に答える