簡體   English   中英

在帶有OpenGL ES 1.1的iOS上使用深度緩沖區

[英]Using depth buffer on iOS with OpenGL ES 1.1

我正在嘗試使用深度緩沖區,以便可以開始為iOS開發游戲。 我對OSX的OpenGL和Objective-C很好,但這是我第一次制作iphone應用程序。

我刪除了ES1Renderer和ES2Renderer類,並將ES1代碼移到EAGLView類中。 當我這樣做時,默認動畫有效。 當我嘗試使用透視圖時,它出錯了。 我現在得到白屏。 有人可以告訴我我在做什么錯嗎?

在初始化方法中:

// Create default framebuffer object.
    glGenFramebuffersOES(1, &defaultFramebuffer);
    glGenRenderbuffersOES(1, &colorRenderbuffer);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);
    //Initialisation code for the game's graphics and to develop the scene
    glEnable(GL_DEPTH_TEST); //Enables Depth Testing
    glDepthFunc(GL_LEQUAL);
    glDepthMask(GL_TRUE);
    //glEnable(GL_CULL_FACE);
    //glCullFace(GL_FRONT);
    //Setup projection matrix
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    double xmax = 0.04142135624 * ((float) backingWidth)/backingHeight;
    glFrustumf(-xmax, xmax, -0.04142135624, 0.04142135624, 0.1, 2000); //The ymax and min have been precalculated
    glMatrixMode(GL_MODELVIEW); //Select The Modelview Matrix
    glLoadIdentity();

在drawView方法中:

    static const GLfloat squareVertices[] = {
        1,   1,-0.1f,
        -1,   1,-0.1f,
        1,  -1,0.1f,
        -1,  -1,0.1f,
    };

    static const GLubyte squareColors[] = {
        0,0,200,255,
        40,90,250,255,
        0,0,200,255,
        50,100,230,255,
    };
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClear(GL_DEPTH_BUFFER_BIT);
    glVertexPointer(3, GL_FLOAT, 0, squareVertices);
    glEnableClientState(GL_VERTEX_ARRAY);
    glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
    glEnableClientState(GL_COLOR_ARRAY);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];

在layoutSubviews方法中:

// Allocate color buffer backing based on the current layer size
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*) self.layer];
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
    glGenRenderbuffersOES(1, &depthRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);

    if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)  != GL_FRAMEBUFFER_COMPLETE_OES) 
    {
        NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) );
        return NO;
    }

    return YES;
    [self drawView:nil];

我已經完成了似乎必須要做的所有事情。 我不知道為什么iOS這么復雜。

感謝您的任何幫助。

我可能讀錯了,但是您正在定義一個包含以下內容的剪貼框:

glFrustumf(-xmax, xmax, -0.04142135624, 0.04142135624, 0.1, 2000);

以及您嘗試渲染的對象:

static const GLfloat squareVertices[] = { 
        1,   1,-0.1f, 
        -1,   1,-0.1f, 
        1,  -1,0.1f, 
        -1,  -1,0.1f, 
    };

在頂部,您將Z值從0.1剪切到2000。但是您的頂點的Z值從-0.1到0.1。 這些看起來不重疊。

您可能想要嘗試將要查看的對象移到可以看到它的區域。

看一下代碼,您可以在此頁面上找到作者在需要深度緩沖區的情況下初始化其方法的EAGLView子類的參數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM