シェーダについて勉強していたのですが、ちょっと関係ないところで詰まってしまって、質問させていただくことにしました。
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);
使えないということはないと思うのですが、どこか間違いがございましたら教えていただきたいです。
当方の力不足で、コードがごちゃごちゃしてしまっていますが、どうぞよろしくおねがいします。
全ソースコードをアップロードしておきます。
GameViewController.mの先頭にあるプリプロセッサを1にするとtextureWithContentsOfURLによる
読み込み方式、0にすると問題の読み込み方式になります。
(http://fast-uploader.com/file/6970154094387/)
(環境)macbookair,Xcode6
OpenGLes2.0を使用