5.3、深入探讨不用GLKit添加深度缓存

在iOS 5引人GLKit之前,开发者需要创建与GLKView相似的一个UIView的子类。回顾一下2.4节,例子OpenGLES_Ch2_2创建了AGLKView类以复制GLKit的; GLKView类的多个功能;例子OpenGLES_Ch5_3通过复制它的深度缓存功能,类似地探索了GLKView是怎么工作的。几乎对于所有用途来说,基于苹果优化的、测试的、面向未来的GLKView的实现都是最好的,而不是任何应用特定的类。如果你没有兴趣继续深入学习GLKView,可以随意跳过这一节。

下面是不用GLKit的辅助而管理一个OpenGLES深度缓存所需的步骤:

  1. Generate (生成)一告诉 OpenGL ES为深度缓存生成一个独一无二的标识符。
  2. Bind (绑定)一告诉 OpenGL ES在接下来的操作中使用哪一个缓存。
  3. Configure Storage (配置存储)---指定 深度缓存的大小。
  4. Attach (附加) 附加深度缓存到一个帧缓存。

OpenGLES_Ch5_3产生的输出与OpenGLES_Ch5_2产生的输出相同,但是OpenGLES_Ch5_3使用了一个扩展自例子OpenGLES_Ch2_2的AGLKView版本,而不是GLKit的GLKView。drawableDepthFormat 属性被添加到AGLKView,同时还有一个用来存储OpenGLES深度缓存标识符的实例变量。下面添加到AGLKView的“layoutSubviews”方法的代码按需创建并配置了一个深度缓存来匹配视图的像素颜色渲染缓存的尺寸。

    if (O != depthRenderBuffer )
    {
        glDeleteRenderbuffers(1, &depthRenderBuffer);
        depthRenderBuffer = O;
    }
    GLint currentDrawableWidth = self.drawableWidth;
    GLint currentDrawableHeight = self.drawableHeight;

    if (self.drawableDepthFormat != AGLKViewDrawableDepthFormatNone &&
         0 < currentDrawablewidth &&
        0 < currentDrawableHeight)
    {
        glGenRenderbuffers(1, &depthRenderBuffer);
        // Step 1
        glBindRenderbuffer (GL_RENDERBUFFER,// Step 2
                depthRenderBuffer);
        glRenderbufferStorage (GL_ RENDERBUFFER,// Step 3
                    GL_DEPTH_COMPONENT16 ,
                    currentDrawablewidth,
                    currentDrawableHeight ) ;
        glFramebufferRenderbuffer (GL_ FRAMEBUFFER, // Step 4
                    GL_DEPTH_ATTACHMENT,
                    GL_RENDERBUFFER,
                    depthRenderBuffer);
    }

与一个CoreAnimation层分享内存的像素颜色渲染缓存在层调整大小时会自动调整大小。其他的缓存,例如深度缓存,并不会自动调整大小。每当一个AGLKView实例被重新调整大小时,与它相关联的层也会调整大小并且视图的“-layoutSubviews” 方法被调用。AGLKView实现了“ -layoutSubviews” 来删除任何现存的深度缓存,并创建一 个新的与像素颜色渲染缓存的新尺寸相匹配的深度缓存。

results matching ""

    No results matching ""