4

OpenGL ES 2.0 でシーンを描画するアプリがあります。Retina ディスプレイを使用しない限り、iPhone と iPad のシミュレーター、および実際のデバイスですべてが正しくレンダリングされます。Retina デバイスは引き続き描画しますが、古いデバイスと同じ解像度です。

新しいデバイスでは、黒い画面しか表示されません。Retina シミュレーターでは、ピンク色の画面が表示されます。プログラムは、glClearColor(); で設定した値を使用することさえありません。

次のコードを使用して、デバイスの倍率を正しく設定できます。

_eaglLayer = (CAEAGLLayer *)self.layer;
_eaglLayer.opaque = YES;

self.contentScaleFactor = [[UIScreen mainScreen] scale];
_eaglLayer.contentsScale = [[UIScreen mainScreen] scale];

そして、ここでレンダー バッファーを正しく作成できます。

glGenRenderbuffers(1, &_depthRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _depthRenderBuffer);

glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, self.frame.size.width, self.frame.size.height);
//Context is an instance of EAGLContext
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];

ビューポートのサイズを次のように設定しました。

glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_backingWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_backingHeight);

...

glViewport(0, 0, _backingWidth, _backingHeight);

このコードはすべて古いデバイスで動作し、次の行をコメントアウトすると問題なく動作します。

self.contentScaleFactor = [[UIScreen mainScreen] scale];
_eaglLayer.contentsScale = [[UIScreen mainScreen] scale];

ビューの読み込み時にスケールをログに記録したところ、Retina デバイスでは値が 2.0 に、古いデバイスでは 1.0 に正しく設定されました。

スケール係数を設定するさまざまなソリューションと方法をいくつか試しましたが、役に立ちませんでした。見えないものがあることは知っていますが、見つけることができません。提案?

4

2 に答える 2

5

他の誰かが eaglLayer.contentsScale の呼び出しは必要ないと言いましたが、何らかの理由でこれは私が呼び出した場合にのみ機能します。UIView サブクラスで次のコードを使用しており、レンダリングはすべてのデバイスで美しく動作します。

CGFloat scale = [[UIScreen mainScreen] scale];

_eaglLayer.contentsScale = scale;
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];

CGSize s = self.frame.size;
glViewport(0, 0, s.width * scale, s.height * scale);
于 2014-02-14T20:51:50.823 に答える