如何使用iOS显示多个OpenGL ES 2.0视图?

时间:2012-08-05 02:08:54

标签: ios opengl-es-2.0

我想在不同的视图中使用OpenGL显示几个不同的3D元素。

我一直在玩< excellent tutorial> 中的代码。当我只使用单个视图显示单个元素时,事情显示得很好,但如果我有多个元素,它只显示一个。

IBOutlet UIView   *openGL;

openGLA = [[OpenGLView alloc] initWithFrame:screenBounds Vertices:[self renderVertices:[self getBucketA]] Indices:[self renderIndices:[self getBucketA]]];
openGLZ = [[OpenGLView alloc] initWithFrame:screenBounds Vertices:[self renderVertices:[self getBucketZ]] Indices:[self renderIndices:[self getBucketZ]]];

[openGL addSubview:openGLA];
[openGL addSubview:openGLZ];

[openGLA render];
[openGLZ render];

[openGLA release];
[openGLZ release];

仅显示A或仅显示Z,但两者都只显示Z坐标最靠近屏幕的内容。我明确地将事物设置为非不透明。

@interface OpenGLView : UIView

- (void)setupLayer
{
    _eaglLayer = (CAEAGLLayer*) self.layer;
    _eaglLayer.opaque = NO;
}

- (id)initWithFrame:(CGRect)frame Vertices:(NSMutableArray *)vertices Indices:(NSMutableArray *)indices
{
    self = [super initWithFrame:frame];
    if (self)
    {
        [self setupLayer];
        [self setupContext];
        [self setupDepthBuffer];
        [self setupRenderBuffer];
        [self setupFrameBuffer];
        [self compileShaders];
        [self setupVBOs];
    }
    return self;
}

- (void)render
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);

    CC3GLMatrix *projection = [CC3GLMatrix matrix];
    float h = 4.0f * self.frame.size.height / self.frame.size.width;
    [projection populateFromFrustumLeft:-2 andRight:2 andBottom:-h/2 andTop:h/2 andNear:4 andFar:10];
    glUniformMatrix4fv(_projectionUniform, 1, 0, projection.glMatrix);

    CC3GLMatrix *modelView = [CC3GLMatrix matrix];
    [modelView populateFromTranslation:CC3VectorMake(0, 0, -7)];
    [modelView rotateBy:CC3VectorMake(20, -45, -20)];

    glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView.glMatrix);

    glViewport(0, 0, self.frame.size.width, self.frame.size.height);

    glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
    glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3));

    glDrawElements(GL_TRIANGLES, indicesSize/sizeof(Indices[0]), GL_UNSIGNED_SHORT, 0);

    [_context presentRenderbuffer:GL_RENDERBUFFER];
}

这些方法大多是直接来自教程,只有很少的非相关修改(我认为)。

为了显示所有不同的视图,我需要做些什么吗?这种方法是否有效或者我应该做些什么?

1 个答案:

答案 0 :(得分:2)

我认为问题与在两个单独的视图中创建两个单独的gl上下文有关。如果你要创建两个glviews,你应该在两个视图之间共享相同的上下文(很高兴知道:这会强制视图在同一个线程中,否则你以后会遇到麻烦)。第二种选择是不断重置每个视图的上下文。我必须说我不喜欢这两种解决方案,如果你认真对待开发更深入的OpenGL知识,我强烈建议将两者融合在一起。

此处有更多信息:https://stackoverflow.com/a/8134346/341358