0

4 つの頂点間の単純な正方形に描画されるテクスチャを読み込もうとしています。残念ながら、これが機能しているように見える唯一の方法は、画像データをロードするためのコードを、すべてのフレームで呼び出される関数に入れることです。私のコードはもともと ARToolKit 関数に基づいていました (したがって、drawCube という名前が付けられました)。私のコードは次のようになります。

- (void) drawCube
{

glStateCacheEnableTex2D();
glStateCacheEnableBlend();
glStateCacheBlendFunc(GL_ONE, GL_SRC_COLOR);
glStateCacheEnableClientStateVertexArray();
glStateCacheEnableClientStateTexCoordArray();
glStateCacheEnableClientStateNormalArray();


const GLfloat cube_vertices [4][3] = {
    {-1.0f, 1.0f, -1.0f}, {1.0f, 1.0f, -1.0f}, {-1.0f, -1.0f, -1.0f}, {1.0f, -1.0f, -1.0f} };
const GLfloat texCoords [4][2] = {
    {0.0, 1.0}, {1.0, 1.0}, {0.0, 0.0}, {1.0, 0.0}
};
const GLfloat normals [4][3] = {
    {0.0, 0.0, 1.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, 1.0}
};


glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

NSString *path = [[NSBundle mainBundle] pathForResource:@"iTunesArtwork" ofType:@"png"];
NSData *texData = [[NSData alloc] initWithContentsOfFile:path];
UIImage *image = [[UIImage alloc] initWithData:texData];
if (image == nil)
    NSLog(@"Do real error checking here");

GLuint width = CGImageGetWidth(image.CGImage);
GLuint height = CGImageGetHeight(image.CGImage);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
void *imageData = malloc( height * width * 4 );
CGContextRef contextt = CGBitmapContextCreate( imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big );
CGContextTranslateCTM (contextt, 0, height);
CGContextScaleCTM (contextt, 1.0, -1.0);
CGColorSpaceRelease( colorSpace );
CGContextClearRect(contextt, CGRectMake( 0, 0, width, height ) );
CGContextTranslateCTM(contextt, 0, height - height );
CGContextDrawImage(contextt, CGRectMake( 0, 0, width, height ), image.CGImage );

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);

CGContextRelease(contextt);

free(imageData);
[image release];
[texData release];

glPushMatrix(); // Save world coordinate system.
glScalef(20.0f, 20.0f, 20.0f);
glTranslatef(0.0f, 0.0f, 1.0f); // Place base of cube on marker surface.
glStateCacheDisableLighting();
glBindTexture(GL_TEXTURE_2D, texture[0]);
glStateCacheVertexPtr(3, GL_FLOAT, 0, cube_vertices);
glStateCacheNormalPtr(GL_FLOAT, 0, normals);
glStateCacheTexCoordPtr(2, GL_FLOAT, 0, texCoords);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glStateCacheDisableClientStateNormalArray();
glStateCacheDisableClientStateTexCoordArray();
glStateCacheDisableClientStateVertexArray();


glPopMatrix();    // Restore world coordinate system.
}

このコードは問題なく動作します。唯一の問題は、AR マーカーがカメラに表示されるたびに呼び出されることです。これはもちろん問題ありません。ただし、画像データ行を init 関数に移動しようとすると、テクスチャのない白い四角しか表示されません。移動した行は、上位 3 つの Enable Tex2D/Blend と BlendFunc です。その後、通常の座標の後、[texData リリース] までのすべて。ここで読んだチュートリアルに基づいてコードを作成しています: http://iphonedevelopment.blogspot.com/2009/05/opengl-es-from-ground-up-part-6_25.html

すべてが私にとって適切な場所にあるように思えますが、明らかにそうではありません。誰かが私の問題に光を当ててもらえますか?

4

1 に答える 1

0

あなたの初期化コードが見えないので、はっきりとはわかりません。おそらく、OpenGLコンテキストを設定する前に、このコードを実行してテクスチャをロードしています。コンテキストの作成は、Xcode用のAppleのOpenGLアプリテンプレートのビューコントローラのviewDidLoadメソッドで行われます。サーバーがオフラインであるため、このブログシリーズからテンプレートをダウンロードできませんでした。たぶん、あなたのテンプレートは同じメソッドでコンテキストを作成します。テクスチャ読み込みコードを移動して、コンテキストの作成後に実行されるようにしてください。

ちなみに、このチュートリアルはかなり古いです。そのブログエントリが投稿されてから、GLKitがiOSSDKに追加されました。GLKitには、非常に便利なテクスチャ読み込みコードが含まれています。

于 2012-12-07T16:36:47.863 に答える