关于如何从头开始创建环境,可以参考大神的博文, 本文只是补充一些我在实践中的一些思考。
根据官方文档的说明,这个 layer 用于 OpenGL 与 Core Animation 库之间的联系。这个 layer 的内容来自于一个 renderbuffer,而他自己所做的主要工作就是为 renderbuffer 分配内存,在用户绘制完成后讲 renderbuffer 送给 Core Animation. 使用的方法大家都知道,就是 override view 的 layerClass 静态方法,返回这个东西。
创建这俩 buffer 相对容易理解,这里没有 GLKViewController 来替我们创建所需的 OpenGL 环境所以我们需要自己创建用与绘制的 buffer,没有这俩 buffer,相当于没有画板。我们用 OpenGL 做 Render to texture 这样的事情的时候也需要自己创建 framebuffer object,但是那时候往往不用 renderbuffer,而使用 texture。这两者的区别是这样的,在过去那些美好时光里纹理是 framebuffer 附件的唯一可用的类型,后来引进的 renderbuffer object,那么相比较 texture,Renderbuffer 的优点是,以 OpenGL 原生渲染格式储存它的数据,因此在离屏渲染的时候,这些数据就相当于被优化过的了。
有些离题,回到 iOS 这边,示例代码如下
- GLuint colorRenderbuffer;
- glGenRenderbuffers(1, &colorRenderbuffer);
- glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
- [myContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:myEAGLLayer];
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
该说明的地方大神的博文已经说明此处不再赘述,但是需要留心的事情是,因为 renderbuffer 的尺寸是从 EAGLLayer 中得到,如果 EGLLayer 的尺寸不正确,会导致最终的图像大小不如预期。在 apple 的 这篇文章提到,在高分辨率的设备上渲染 OpenGL ES, 如果不做设置,那么出现的图像会变得 blockly,应该是说是块状的,就是不太清晰,其建议就是使用较大的 scale 值。可以这样设置:
- eaglLayer.contentsScale = [UIScreen mainScreen].scale;
记住,如果将 eagl layer 的 scale 值设置变大了,那么在
的时候要使用相应的成倍数的尺寸。
- glviewport()
我自己实践了一下,iPhone7 Plus 上,
得到的尺寸为 414x736,设置 glviewport 为这个尺寸,出来的图像正常。然后如下修改:
- [UIScreen mainScreen].bounds
- eaglLayer.contentsScale = [UIScreen mainScreen].scale;
- glViewport(0, 0, (GLsizei) (size.width * scale),
- (GLsizei) (size.height * scale));
即同时修改 layer 和 viewport,得到的结果粗看起来和原来的差别不大,但是仔细查看细节边缘,前者的锯齿会更明显,后者分辨率更好。所以总的思路就是 layer 的 scale 和 viewport 要保持同步,两个都不改也可,两个都改也可。如果只修改了 viewport 的值,将其增大了,那就相当于视口变大了,底下的 renderbuffer 还是那么小,renderbuffer 只能留下窗口的一个角落的图像。看起来就是,图像放的很大,然后只能看见角落里面的部分,一看就知道有问题。我们可以用下面的方法来确认 renderbuffer 的大小对不对。
- // Get the renderbuffer size.
- GLint width;
- GLint height;
- glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &width);
- glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &height);
来源: http://www.cnblogs.com/psklf/p/6403128.html