0

アプリ ストア以外のアプリでは、プライベート フレームワーク Core Surface を使用して、iPhone の画面に直接描画しています。ただし、CPU を大量に使用して描画を行うため、古いデバイスではかなり遅くなる可能性があります。これを修正するために、OpenGLES を使用してピクセルを画面にレンダリングすることにしました。

現在 (これを変更する方法はありません)、BaseAddress と呼ばれる unsigned short * 変数への参照があり、重要なサード パーティ コードが BaseAddress にアクセスし、新しいピクセル データで更新します。

GLKViewController をセットアップし、viewDidLoad を次のように実装しました。

- (void)viewDidLoad {
    [super viewDidLoad];

    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

    if (!self.context) {
        NSLog(@"Failed to create ES context");
    }

    [EAGLContext setCurrentContext:self.context];

    GLKView *view = (GLKView *)self.view;
    view.context = self.context;

    glGenBuffers(1, &screenBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, screenBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(BaseAddress), BaseAddress, GL_DYNAMIC_DRAW);

}

screenBuffer はインスタンス変数です。glkView:drawInRect: メソッドには、次のものがあります。

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
    glDrawElements(GL_ARRAY_BUFFER, sizeof(BaseAddress)/sizeof(BaseAddress[0]), GL_UNSIGNED_SHORT, BaseAddress);
}

残念ながら、アプリを実行すると黒い画面しか表示されません。Core Surface の使用に戻ると、アプリは正常に動作します。基本的に、OpenGLES を使用して画面にピクセルを描画するにはどうすればよいですか?

4

1 に答える 1

0

テクスチャを使用するのが最善であると思います。あなたの場合、iOS デバイス用の古い ES1 テンプレートを見つけようとします。基本的に必要なのは、UIView レイヤーから作成されたフレーム バッファーとカラー バッファーです。

    glGenFramebuffers(1, &viewFramebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer);
    glGenRenderbuffers(1, &viewColorBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, viewColorBuffer);
    [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewColorBuffer);

    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, & backingHeight);

射影行列についてglOrthof(.0f, backingWidth, backingHeight, .0f, -1.0f, 1.0f);は、GL座標をビュー座標と同じにするために使用することをお勧めします。

次に、いくつかの初期化でテクスチャを生成し、それをバインドして 2 の累乗の次元 ( textureWidth = 1; while(textureWidth < backingWidth) textureWidth = textureWidth << 1;) を与え、データ ポインタに NULL を渡します (すべて関数 "glTexImage2D" 内)。

次に、(0,0) から (textureWidth, textureHeight) までのテクスチャと同じ正方形の頂点配列と、(0,0) から (1,1) までのテクスチャ座標を生成します。

ポインタにデータを取得し、テクスチャにプッシュする準備ができたら、glTexSubImage2Dそれを更新します: テクスチャのデータを取得する場合はテクスチャのセグメントのみを更新するか、画面全体を更新するには rect (0,0,screenWidth を使用します) 、画面の高さ)

テクスチャでこれらの 2 つの三角形を描画するだけです。

  • テクスチャのサイズには制限があることに注意してください: ほとんどのアクティブな iOS デバイス 1<<11 (2048) iPad3 1<<12
  • 作成時にテクスチャ パラメータを設定することを忘れないでください。glTexParameteri
  • Retina ディスプレイを確認し、必要に応じて CAEAGLLayer のコンテンツ スケールを 2 に設定します。
于 2012-09-12T09:57:02.513 に答える