OpenGL ES2.0 画像の取得方法について

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

OpenGL ES2.0 画像の取得方法について

#1

投稿記事 by bonbo » 10年前

お世話になっております。
シェーダについて勉強していたのですが、ちょっと関係ないところで詰まってしまって、質問させていただくことにしました。
OpenGLES2.0で画像の表示をするにあたり、OpenGL1.1までで使っていたglTexImage2Dなどの関数を使って読み込んでみようと試みたところ、画像がうまく表示されずに困っていおります。
具体的には、ポリゴンにミップマップを効かせたテクスチャを貼り付けて表示したいのですが、真っ黒に表示されてしまうという状況です。
(textureWithContentsOfURL他新しく導入された関数を使い取得を行った場合は画像が表示されました。)
以下コードの読み込みと描画の場面です。

コード:

// 使用変数
GLuint tex_;//テクスチャのidを格納するためのグローバル変数
GLKTextureInfo *texinfo;// textureWithContentsOfURLを受け取るためのグローバル変数(これの.nameがテクスチャのid?)

コード:

// 読み込み
// プリプロセッサで成功した方と失敗した方で分けている。
#if 1
// 新関数を用いた読み込み方式(成功)
    NSURL *imurl=[[NSBundle mainBundle ]URLForResource:@"tex_block_1" withExtension:@"png"];
    texinfo=[GLKTextureLoader textureWithContentsOfURL:imurl options:nil error:NULL];

#else
// 今回やりたい読み込み方式(失敗)
    CGImageRef image = [UIImage imageNamed:@"tex_block_1.png"].CGImage;
    //画像の大きさを取得します
    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,CGColorSpaceCreateDeviceRGB(),(CGBitmapInfo)kCGImageAlphaPremultipliedLast);// 第六引数がCGImageGetColorSpace(image)だとバグる模様
    
    CGContextDrawImage(imageContext, CGRectMake(0, 0, (CGFloat)width, (CGFloat)height), image);
    
    CGContextRelease(imageContext);
    
    //OpenGL用のテクスチャを生成します
    GLuint texture;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glGenerateMipmap(GL_TEXTURE_2D);

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
    
    for (int i=0; i<width*height; i++) {
        int r = imageData[i*4+0]; /* R要素 */
        int g = imageData[i*4+1]; /* G要素 */
        int b = imageData[i*4+2]; /* B要素 */
        NSLog(@"rgb(%d,%d,%d)",r,g,b);// 要素をチェック(ここはできている。)
    }
    
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);//ここでセットされていない?
    
    free(imageData);// imageDataを解放
    
    tex_=texture;// テクスチャのIDを取得
#endif

コード:

//描画
glUseProgram(_program);
    
    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
    glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);
    glUniform1f(uniforms[UNIFORM_VALUE], value);
    glActiveTexture(GL_TEXTURE0);
#if 1
    glBindTexture(GL_TEXTURE_2D, texinfo.name);
#else
    glBindTexture(GL_TEXTURE_2D, tex_);
#endif
    glUniform1f(uniforms[UNIFORM_TEX0], 0);
    glDrawArrays(GL_TRIANGLES, 0, 36);
OpenGLES2.0プログラミングガイド(Pearson)にはこちらのテクスチャ取得方法がかかれていたので、
使えないということはないと思うのですが、どこか間違いがございましたら教えていただきたいです。
当方の力不足で、コードがごちゃごちゃしてしまっていますが、どうぞよろしくおねがいします。

全ソースコードをアップロードしておきます。
GameViewController.mの先頭にあるプリプロセッサを1にするとtextureWithContentsOfURLによる
読み込み方式、0にすると問題の読み込み方式になります。
http://fast-uploader.com/file/6970154094387/
(環境)macbookair,Xcode6
OpenGLes2.0を使用

ISLe()

Re: OpenGL ES2.0 画像の取得方法について

#2

投稿記事 by ISLe() » 10年前

テクスチャに画像をセット(glTexImage2D)したあとにglGenerateMipmapを呼び出さないといけないのではないでしょうか。

画像をセットする前の空のテクスチャでミップマップテクスチャを作成しているので真っ黒なのだと思いますが。

bonbo

Re: OpenGL ES2.0 画像の取得方法について

#3

投稿記事 by bonbo » 10年前

>ISLe()様
ありがとうございます。
ご指摘の通り取得30行目にあったglGenerateMipmap(GL_TEXTURE_2D);を
42行目 glTexImage2Dの後ろに持ってきたら正しく動きました。
言い訳ですが、GL1.1の時に同じ位置で使っていたgl_TexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_TRUE)で生成する方法がなくなってしまっていたため関数の位置がそのままになっていました。
お世話になりました。

閉鎖

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