先看最终的效果
WechatIMG6.jpeg
本文章是基于文章一,开始讲解的。 效果就是个3D的正方体的盒子。 如果实现这个效果需要的步骤: 1.创建窗口 2.初始化环境(Context) 3.申请缓存区(渲染缓存,深度测试,帧缓存) 4.加载着色器关联链接程序 5.设置顶点 6.加载纹理 7.渲染 其中,创建窗口,初始化环境(Context),申请缓存区(渲染缓存,帧缓存),加载着色器关联链接程序,设置顶点,加载纹理。 这几个步骤同文章一,下面主要讲解下申请缓存区(深度测试),和渲染的步骤。
一般情况下我们要申请渲染缓存区,帧缓存区,如果使用深度测试也需要申请深度缓存区。 其中渲染缓存区
// 创建 绑定 渲染缓存
glGenRenderbuffers(1, &_myColorRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _myColorRenderBuffer);
帧缓冲区
// 创建 绑定帧缓存
glGenFramebuffers(1, &_myColorFrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _myColorFrameBuffer);
在创建和绑定好渲染缓存区和帧缓存区后,还需要绑定下
// 在帧缓存 和 渲染缓存创建 和 绑定结束后需要
// 渲染缓存作为帧缓存的某种(颜色、深度、模板)附件
glFramebufferRenderbuffer(
//帧缓冲区类型
GL_FRAMEBUFFER,
//缓冲附件类型
GL_COLOR_ATTACHMENT0,
//渲染缓冲区类型
GL_RENDERBUFFER,
//渲染缓冲句柄
_myColorRenderBuffer);
下面需要开始创建深的缓存区
// 深度缓存
GLint width;
GLint height;
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height);
// 申请深度渲染缓存
glGenRenderbuffers(1, &_depthRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _depthRenderBuffer);
// 设置深度测试的存储信息
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);
// 关联深度缓冲到帧缓冲区
// 将渲染缓存挂载到GL_DEPTH_ATTACHMENT这个挂载点上
glFramebufferRenderbuffer(
GL_FRAMEBUFFER,
GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER,
_depthRenderBuffer);
// GL_RENDERBUFFER绑定的是深度测试渲染缓存,所以要绑定回色彩渲染缓存
glBindRenderbuffer(GL_RENDERBUFFER, _myColorRenderBuffer);
其中这次glFramebufferRenderbuffer
,是将深度缓存区添加到帧缓存区的深度(GL_DEPTH_ATTACHMENT)附件中。并且还需要重新绑定一次渲染缓存区。
当申请好深度缓存区后,就可以通过glEnable(GL_DEPTH_TEST);
开启深度测试。
最后在每次渲染的时候还需要执行glClear(GL_DEPTH_BUFFER_BIT);
清除深度缓存区。整个深度测试流程就结束了。
代码: https://github.com/YBYHunter/OpenGL-ES-Demo/tree/master
记得Star!Star!