片段着色器的输出时片段的颜色和深度值。下图中的操作发生在片段着色器执行之后,可能影响像素的可见性和最终颜色。
着色器后的而片段管线.png缓冲区
OpenGL ES支持3种缓冲区,每种缓冲区都保存帧缓冲区种每个像素的不同数据:
1、颜色缓冲区(包括前后颜色缓冲区)
2、深度缓冲区
3、模板缓冲区
请求更多缓冲区
要在颜色缓冲区之外加入深度或者模板缓冲区,选哟在指定EGL配置属性时请求它们。
esCreateWindow ( &esContext, “Application Name”,
window_width, window_height,
ES_WINDOW_RGB | ES_WINDOW_DEPTH |
ES_WINDOW_STENCIL );
清楚缓冲区
OpenGL ES时一个交互式渲染系统。缓冲区的内容可以通过glClear函数清楚:
void glClear(GLbitfield mask)
void glClearColor( GLfloat red,
GLfloat green,
GLfloat blue,
GLfloat alpha)
void glClearDepthf(GLfloat depth)
void glClearStencil(GLint s)
用掩码控制帧缓冲区的写入
可以通过指定一个缓冲区写入掩码来控制哪些缓冲区或者分量可以写入。
void glColorMask(GLboolean red,
GLboolean green,
GLboolean blue,
GLboolean alpha)
void glDepthMask(GLboolean depth)
void glStencilMask(GLuint mask)
void glStencilMaskSeparate(GLenum face,
GLuint mask)
片段测试和操作
默认情况下,所有片段测试和操作都被禁用,片段在写入帧缓冲区时按照接收它们的顺序变成像素。通过启用不同的片段,可以应用操作性测试,以选择哪些片段成为像素并影响最终的图像。
使用剪裁测试
裁剪测试通过指定一个矩形区域提供额外的裁剪层次。
void glScissor(GLint x,
GLint y,
GLsizei width,
GLsizei height)
模板缓冲区测试
模板测试实际上是一个位测试,就像在C程序中使用掩码确定某一位是否置位一样。控制模板测试的运算符和值的模板函数由:
void glStencilFunc(GLenum func,
GLint ref,
GLuint mask)
void glStencilFuncSeparate(GLenum face,
GLenum func,
GLint ref,
GLuint mask)
混合
一旦片段通过了所有启用的片段测试,它的颜色将与片段像素位置种已经存在的颜色组合。在两个颜色组合之前,它们与一个比例因子相乘,然后用指定的混合运算符组合。混合方程式:
颜色混合方程.png
Fsource和Csource分别式输入片段的比例因子和颜色。Fdes和Cdes式像素的比例因子和颜色,op是组合折算值的数学运算符。
void glBlendFunc(GLenum sfactor,
GLenum dfactor)
void glBlendFuncSeparate(GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
GLenum dstAlpha)
抖动
由于帧缓冲区中每个分量的位数导致的帧缓冲区中可用颜色数量有限的而系统上,我们可以用抖动模拟更大的色深。
多重采样抗锯齿
抗锯齿是通过尝试减少不同像素渲染中产生的视觉伪像来改进生成图像质量的一种重要技术。
在帧缓冲区读写像素
若想要为后代渲染过的图像,可以从颜色缓冲区中读回像素值,但是不能从深度或者模板缓冲区中读取。当调用glReadPixels时,颜色缓冲区中的像素将从一个前面分配的数组中返回到你的应用程序中。
void glReadPixels(GLint x,
GLint y,
GLsizei width,
GLsizei height,
GLenum format,
GLenum type,
GLvoid *pixels)
多重渲染目标
多重渲染目标(MRT)允许应用程序一次渲染到多个颜色缓冲区。利用多重渲染目标,片段着色器输出多个颜色,每个颜色用于一个连接的颜色缓冲区。MRT用于多种高级渲染算法中,例如延迟着色和快速环境遮蔽估算。
小结
本章主要讲解有关片段着色器之后发生的测试和操作内容(剪裁矩形测试、模板缓冲区测试、深度缓冲区测试、多重采样、混合和抖动)。
网友评论