iOS
GLKit
Swift

GLKTextureLoaderで画像が反転する場合の対処法

More than 1 year has passed since last update.

GLKitを使えばテクスチャのロードが簡単になりました。

しかしいざ使ってみると、画像の縦Vと横Uが逆になっていて困っていました。

ネットで調べたのですが、行列変換で対応するなどあって、そうするしかないのかなと諦めてましたが、

リファレンス見たらローディング時のOption指定で解決できたので共有します。

let textureInfo = try GLKTextureLoader.textureWithContentsOfFile(filePath!, options: [GLKTextureLoaderOriginBottomLeft:NSNumber(bool:true)])


GLKTextureLoaderOriginBottomLeft

This key specifies whether the image data should be vertically flipped to match OpenGL’s coordinate system. The value for this key is an NSNumber object that specifies a boolean value. If NO, the image data is not flipped. If YES, the image data is flipped before being loaded. If the key is not specified, the default value is NO.


OpenGLの座標システムに合うように垂直方向に画像をフリップします。

値はNSNumberのboolでtrue / falseを指定してください.

falseの場合はフリップしません。trueの場合は、読込の前にフリップします。

デフォルトではこの値はfalseです。

垂直と書いていますが、自分は水平方向も反転も治りました。


他オプションについて少し説明すると


GLKTextureLoaderApplyPremultiplication

アルファ値を事前にRGBに乗算しておくオプション。

圧縮形式の画像には使ってはいけないみたい。

デフォルトはfalse


GLKTextureLoaderGenerateMipmaps

テクスチャからミップマップを作成します。

trueを指定することで、全階層のミップマップを生成します。

ミップマップを生成した場合は、GL_TEXTURE_MIN_FILTERではなくGL_LINEAR_MIPMAP_LINEARを使うこと

デフォルトはfalse


ミップマップとは

同一画像だけどサイズが別の複数枚つかって、距離の遠い画像は、画質の荒い画像(メモリ消費の少ない)を表示し、距離の近い画像は画質の高い画像(メモリ消費の高い)を表示するといった、メモリ効率に役立つしくみです。


GLKTextureLoaderGrayscaleAsAlpha

グレイスケール画像の画像データをアルファ情報として扱うかどうかを指定する。

読込画像が画像がグレイスケール画像ではない場合はこのオプションは無視される。

デフォルトはfalse


グレイスケールとは

白から黒の間の色で構成された画像。

アルファ用として用いることが多く、単純な色抜きだったり、白の画像に対してグレイスケールをブレンドすることで、雲を表現したパーティクル系につかったり、ディスプレイスメントマップとしてシェーダーなどで使ったりされます。


GLKTextureLoaderSRGB

画像をsRGBデータとして扱うかどうかを指定する。

デフォルトはfalse