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