5

iPhoneの全画面サイズを描画面として使用しないOpenGLESアプリを作成する方法を知っている人はいますか?

これまでに見たものはすべて、EAGLView(またはその他)が0、0、320、480に描画されています。

EAGLViewを100、100、100、100にしたいのですが、これは可能ですか?glViewport()呼び出しを変更するだけでよいようですが、わかりません... glViewportは、フルスクリーンのOpenGL ESビュー用にクリッピング長方形を設定するだけですか?それとも、原点(0、0)がどこにあるかを実際に定義していますか?

特に、私がUIViewsの観点から考えようとしている場合は、非常に混乱します。CGRectを初期化関数に渡して、glViewportとその他すべてをその長方形に設定します。

ありがとう!

4

1 に答える 1

6

開始するときに、EAGLViewクラスから必要なフレームを使用して[super initWithFrame:frame]を呼び出すだけです。この例では、左上隅に透明なOpenGLビューを作成し、それをコントローラービューに追加します。

EAGLViewクラスに次のコードがあります。

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        // get the layer
        CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
        eaglLayer.opaque = NO;
        eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                        [NSNumber numberWithBool:NO], 
                                        kEAGLDrawablePropertyRetainedBacking, 
                                        kEAGLColorFormatRGBA8, 
                                        kEAGLDrawablePropertyColorFormat, 
                                        nil];
        context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];     
        if (!context || ![EAGLContext setCurrentContext:context]) {
            [self release];
            return nil;
        }
        [EAGLContext setCurrentContext:context];
        [self destroyFramebuffer];
        [self createFramebuffer];           
    }
    return self;
}

次に、コントローラーから次のようにEAGLViewを作成します。

theEAGLView = [[EAGLView alloc] initWithFrame:CGRectMake(30.0f, 30.0f, 
                                                         90.0f, 70.0f)];
theEAGLView.opaque = NO;
[self.view addSubview:theEAGLView];

EAGLViewクラスで実際の描画を行うコードは、コントローラーから呼び出され、次のようになります。

- (void)render {
    glViewport(0, 0, backingWidth, backingHeight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrthof(0.0f, backingWidth, 0.0f, backingHeight, 1000.0f, -1000.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    // this is where we draw our stuff
    // ...
    // ...

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
于 2009-09-08T09:05:52.477 に答える