連続投稿になってしまい申し訳ございません。
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); }