Retina ディスプレイをサポートするように OPENGL ES アプリを作成しようとしていました。@2x 拡張子の付いた画像を追加し、contentscale 係数を 2 にしました。高解像度の画像は正しく画面に表示されますが、品質が大幅に低下します。エッジがぼやけていて、リソース フォルダーに追加した画像の品質がありません。
どうすればこれを修正できますか?
Retina ディスプレイをサポートするように OPENGL ES アプリを作成しようとしていました。@2x 拡張子の付いた画像を追加し、contentscale 係数を 2 にしました。高解像度の画像は正しく画面に表示されますが、品質が大幅に低下します。エッジがぼやけていて、リソース フォルダーに追加した画像の品質がありません。
どうすればこれを修正できますか?
私のアプリはデフォルトのフレームワークに基づいており、Retinaベースのデバイスで実行しているときにこの問題が発生していました。具体的には、フレームバッファは、希望どおり640x960ではなく320x480で作成されていました。ジェームズ申し訳ありませんが、問題はrenderBufferStorage:fromDrawable:によって作成されたフレームバッファにあるため自動ではありません(これは私たちに代わってglRenderbufferStorageを呼び出しますが、デフォルトでは幅と高さのネイティブデバイスピクセルではなくレイアウトピクセルを指定します)。
initWithCoderでeaglLayer.drawablePropertiesを設定する行の行の下に次のコードを追加しました: EAGLView.mで:
UIScreen *mainScreen = [UIScreen mainScreen];
if ([mainScreen respondsToSelector:@selector(scale)])
{
// iOS 4.0 and up (further to simeon's comment)
const CGFloat scale = mainScreen.scale;
self.contentScaleFactor = scale;
eaglLayer.contentsScale = scale;
}
私を正しい方向に向けてくれたDavidAmadorの投稿に感謝します。最近では、simeonの有益なコメントに感謝します。
EAGLView.m initWithCoder:メソッドに、次のコードを追加します。
if( [[UIScreen mainScreen] respondsToSelector:@selector(scale)] )
{
self.contentScaleFactor = [[UIScreen mainScreen] scale];
}
OpenGLES は Retina ディスプレイで可能な限り最大の解像度で自動的にレンダリングされるため (ビューポートを画面の幅と高さに設定している場合など)、問題は OpenGL レンダリングに起因します。
OpenGLES は、画像に追加したサフィックス @2X を気にしません (これは Cocoa Touch フレームワーク用です)。ただし、画像の解像度には注意が必要です。最良の結果を得るには、幅と高さが 2 のべき乗である正方形の画像を使用する必要があります (例: 1024、2048 など)。
テクスチャを OpenGLES にロードするときは、正しいイメージ フォーマットを使用していること、および決して圧縮していないことを確認する必要があります。
他に試す必要があるのは、テクスチャ パラメータです。例えば:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
これがあなたを正しい方向に向けてくれることを願っています。