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 はありません。