0

さまざまなビューで OpenGL を使用して表示したいいくつかの異なる 3D 要素があります。

この<優れたチュートリアル>のコードで遊んでいます。単一のビューを使用して表示する要素が 1 つしかない場合は問題なく表示されますが、複数の要素がある場合は 1 つしか表示されません。

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];
}

メソッドは、関連のない変更を最小限に抑えたチュートリアルからほとんどそのままです(私は思います)。

さまざまなビューをすべて表示するために必要なことはありますか? このアプローチは機能しますか、それとも何か他のことをする必要がありますか?

4

1 に答える 1

2

問題は、2 つの別々のビューで 2 つの別々の gl コンテキストを作成することに関係していると思います。2 つの glview を作成している場合は、2 つのビュー間で同じコンテキストを共有する必要があります (知っておくと便利: これにより、ビューが同じスレッド内にあることが強制されます。そうしないと、後で問題が発生します)。2 番目のオプションは、各ビューのコンテキストを常にリセットすることです。私はこれらのソリューションの両方が好きではないと言わなければなりません.OpenGLのより深い知識を真剣に開発している場合は、2つを1つのglviewにマージすることを強くお勧めします.

詳細はこちら: https://stackoverflow.com/a/8134346/341358

于 2012-08-05T23:00:22.517 に答える