私のアプリ ( Tres ) では、画像ピッカーから画像を読み込んでテクスチャに配置しています。すべてのテストで問題なく動作しましたが、Retina ディスプレイを搭載した iPad を使用しているオンライン ユーザーは、画像が黒くなると不満を漏らしています。
GL_MAX_TEXTURE_SIZE を調べて、画像がそれより大きくないことを確認しています。
ここでテクスチャをセットアップします。
texture_aspect = image.size.width / image.size.height;
CGFloat side = image.size.width;
if(side>GL_MAX_TEXTURE_SIZE)
side = GL_MAX_TEXTURE_SIZE;
UIImage *newImage = [ImageUtils imageWithImage:image scaledToSize:CGSizeMake(side, side)];
image_height = 600.0f;
image_width = image_height * texture_aspect;
if(image_width>600.0f) {
image_width = 900.0f;
image_height = image_width / texture_aspect;
}
NSError* error;
GLKTextureInfo * texture = [GLKTextureLoader textureWithCGImage:newImage.CGImage options:nil error:&error];
if (error) {
NSLog(@"Error loading texture from image: %@",error);
}
そして、これが私が画像を描く方法です:
- (void) dibujaFoto {
self.effect.texture2d0.enabled = GL_TRUE;
[self.effect prepareToDraw];
glEnableVertexAttribArray(GLKVertexAttribPosition);
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
GLfloat squareVertices[] = {
-image_width/2, -image_height/2,
image_width/2,-image_height/2,
-image_width/2, image_height/2,
image_width/2,image_height/2,
};
const GLfloat squareTextureCoords[] = {
0.0, 1.0,
1.0, 1.0,
0.0, 0.0,
1.0, 0.0,
};
glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, squareVertices);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, squareTextureCoords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableVertexAttribArray(GLKVertexAttribPosition);
glDisableVertexAttribArray(GLKVertexAttribTexCoord0);
self.effect.texture2d0.enabled = GL_FALSE;
}
画像の大きさに関係なく、常に第 2 世代の iPad で動作しますが、Retina ディスプレイではこのコードに問題があるようです。