OpenGL ES基本流程总结

OpenGL ES基本流程总结_第1张图片
作为一个学习总结,绘制了OpenGL ES中完成一次渲染所需要的一些基本步骤。

离屏渲染

此处是以离屏渲染为例,离屏渲染是不直接上屏的,而是渲染到缓冲区中,那么这块缓冲区就需要我们手动创建,也就是上图所示的Framebuffer。其中需要三个部分来存储数据,分别是COLOR_ATTACHMENT, DEPTH_ATTACHMEN 和 STENCIL_ATTACHMENT。其中color部分就用普通的texture即可。depth 和 stencil 部分应该用renderbuffer来实现,另外也有用绑定texture来实现的,好像执行效率有所不同,二者的区别有待研究。

如果需要抗锯齿 MSAA,还需要看平台是否支持以下扩展,常用倍数 2倍,4倍,8倍:

#ifndef GL_IMG_multisampled_render_to_texture
#define GL_IMG_multisampled_render_to_texture 1
#define GL_RENDERBUFFER_SAMPLES_IMG       0x9133
#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134
#define GL_MAX_SAMPLES_IMG                0x9135
#define GL_TEXTURE_SAMPLES_IMG            0x9136
typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);

纹理贴图

在创建texture的时候,需要指定一些参数,这些可以决定贴图最终呈现的效果,有必要了解一下。
WARP_S, WARP_T 是指贴图水平方向和垂直方向的图像填充方式。(s,t) 相当于 (u,v) 或者说 (x,y)。
各种效果展示如下:
OpenGL ES基本流程总结_第2张图片
比较特殊的是GL_CLAMP_TO_BORDER,这时候会用到边框颜色,需要预先进行设置:

float borderColor[] = {1.0f, 1.0f, 0.0f, 1.0f};
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);

MIN_FILTER, 对贴图进行缩小时采用的滤波算法
MAG_FILTER,对贴图进行放大时采用的滤波算法
之所以会产生放大缩小的计算,是因为在3D空间映射到平面上时,会有近大远小的关系。常用的简单滤波算法是GL_NEAREST 和 GL_LINEAR。
想了解更多,就需要深入了解 mipmap 机制,可参考 https://my.oschina.net/sweetdark/blog/177812

Shader

这部分不复杂,稍微注意一下,在编译 shader 和 program 后,最好检查下编译或者链接状态。

你可能感兴趣的:(opengl)