テクスチャ描画のシミュレータでの挙動に関して

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
どどんぱち

テクスチャ描画のシミュレータでの挙動に関して

#1

投稿記事 by どどんぱち » 15年前

お世話になっております。
連続投稿になってしまい申し訳ございません。

iPhone / Objective-C
Xcode バージョン 3.2.3
iPhoneシミュレータ バージョン4.0(最新の4.1でも同じでした)

上記環境にて、OpenGL ESを使用し、

http://iphone.pankaku.com/book/
の書籍を参考にテクスチャ描画を行っています。

< やりたい動作 >
任意の枚数のテクスチャをロード~指定した1枚のテクスチャを表示させます。

テクスチャの読み込みは書籍とは違い、ネットからDLした
画像データをNSDataの状態で以下の読み込み関数に渡しています。

< 現象 >
実機では確認されず正常な動作なのですが、シミュレータ
で上記< やりたい動作 >を行うと、表示させる為に指定したテクスチャ
だけではなく、ロードしたテクスチャが全部~複数枚表示されてしまいます。

複数の実機で試しましたが、シミュレータだけの現象のようですので
何が原因か見当がついておりません。

出来れば、シミュレータ上で正常に動作確認を行えるようにしたいので、
改善方法等がありましたらアドバイスをお願いします。

//画像ファイルからテクスチャを作成します
GLuint loadTexture(NSData* data){
    GLuint texture;
    //画像ファイルを展開しCGImageRefを生成します
    CGImageRef image = [UIImage imageWithData:data].CGImage;
    if(!image){    //画像ファイルの読み込みに失敗したらfalse(0)を返します
        NSLog(@"Error: texture not found");
        return 0;
    }
    
    //画像の大きさを取得します
    size_t width = CGImageGetWidth(image);
    size_t height = CGImageGetHeight(image);
    
    //ビットマップデータを用意します
    GLubyte* imageData = (GLubyte *) malloc(width * height * 4);
    CGContextRef imageContext = CGBitmapContextCreate(imageData,width,height,8,width * 4,CGImageGetColorSpace

(image),kCGImageAlphaPremultipliedLast);
    CGContextDrawImage(imageContext, CGRectMake(0, 0, (CGFloat)width, (CGFloat)height), image);
    CGContextRelease(imageContext);
    
    //OpenGL用のテクスチャを生成します
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);    
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
    free(imageData);

    return texture;
}

void drawTexture(float x, float y, float width, float height, GLuint texture, float u, float v, float tex_width,float tex_height, int red, int green, int blue, int alpha){
    
    //長方形を構成する四つの頂点の座標を決定します
    const GLfloat squareVertices[/url] = {
        -0.5f*width + x,    -0.5f*height + y,
    0.5f*width + x,        -0.5f*height + y,
        -0.5f*width + x,    0.5f*height + y,
    0.5f*width + x,        0.5f*height + y,
        };
    
    //長方形を構成する四つの頂点の色を指定します
    //ここではすべての頂点を同じ色にしています
        const GLubyte squareColors[/url] = {
        red, green, blue ,alpha,
        red, green, blue ,alpha,
    red, green, blue ,alpha,
    red, green, blue ,alpha,
        };
    
    //元画像のどの範囲を描画に使うかを決定します
    const GLfloat texCoords[/url] = {
        u,        v+tex_height,
        u+tex_width,    v+tex_height,
        u,        v,
        u+tex_width,    v,
    };
    
    //テクスチャ機能を有効にし、描画に使用するテクスチャを指定します
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);
    
    //頂点座標と色、およびテクスチャの範囲を指定し、描画します
    glVertexPointer(2, GL_FLOAT, 0, squareVertices);
        glEnableClientState(GL_VERTEX_ARRAY);
        glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
        glEnableClientState(GL_COLOR_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisable(GL_TEXTURE_2D);    
    
    glDisable(GL_BLEND);
}

“C言語何でも質問掲示板” へ戻る