5

任何人都知道如何创建一个不使用完整 iPhone 屏幕尺寸作为其绘图表面的 OpenGL ES 应用程序?

到目前为止,我看到的所有东西都有 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 回答