各种测试的顺序:
剪刀测试-模板测试-深度测试-混合-抖动
opengles支持三种帧缓存,颜色,深度,模板缓存。
颜色缓存一个有16位的RGB565和32位的RGBA,颜色缓存有前后缓存
模板缓存是可选的,要么集成在深度缓存里面
深度缓存至少16为,至少8为被模板缓存。
缓存的clear:
void glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
void glClearColor(red,green,blue,alpha);
void glClearDepthf(depth);
void glClearStencil(GLint S);
void glColorMask(BOOL red,bool green, bool blue, bool alpha);
控制是否能写入这些颜色组件。
void glDepthMask(bool depth);
void glStencilMask(GLuint mask);这是一个bitmask,为1的位能写入。
void glStencilMaskSeparate(GLenum face,GLuint mask);
face 取值为GL_FRONT,GL_BACK,GL_FRONT_AND_BACK.
各种测试的开启:
glEnbale();
GL_DEPTH_TEST,GL_STENCIL_TEST, GL_BLEND, GL_DITHER, GL_SAMPLE_COVARAGE,
GL_SAMPLE_ALPHA_TO_COVARAGE,
GL_SCISSOR_TEST
剪刀测试:
glScissor(GLint x,GLint y,GLsizei width,GLsizei height);指定的是在视口里面的坐标
模板测试:
这个分为两步进行,第一步,给模板缓存填充值,就是在渲染几何物体的时候进行的,需要知道模板
缓存中的值如何被写入,第二步,就是通过这些模板缓存中的值,控制颜色缓存的写入。
模板测试是一种位测试,
在程序开始的时候glClearStencil指定clear值,然后glClear清除模板缓存,这样模板缓存就有个
初始值了。然后使用:
void glStencilFunc(GLenum func,GLint ref,GLuint mask);
func:设置比较函数
GL_EQUAL,GL_NOTEQUAL,GL_LESS,GL_GREATER,
GL_LEQUAL,GL_GEQUAL,GL_ALWAYS,
GL_NEVER.
ref:设置做比较的值。
mask:将这个值和模板缓冲中的值做位与操作,在拿结果在与ref做比较。
模板缓存中的值与mask按位与之后与ref比较,若符合func指定的比较函数,则模板测试通过。
还可以有个机会更新模板缓存中的值。怎么更新模板缓存中的值呢?
有三种情况:
第一模板测试失败,后面的片段操作都不进行了,可以更新模板缓存。
第二,模板测试通过,但深度测试没有通过,可以更新模板缓存。
第三,模板测试和深度测试都通过了,可以更新模板缓存
这三种情况怎么更新模板缓存,通过一个函数glStencilOp设置。
glStencilOp(GLenum sfail,GLenum zfail,GLenum zpass);
这三个枚举的取值为这些:
GL_KEEP,保持不变
GL_ZERO,设置为0,
GL_REPLACE, 使用ref替换
GL_INCR, 使模板缓存中的值加1,值clamp到0-2^n次方
GL_DECR, 减1
GL_INCR_WRAP 同上面的一样,只是值到最大的时候加1的话回到0.
GL_DECR_WRAP,
GL_INVERT. 对模板缓存中的值位取反。
sfail:表示模板测试失败之后,怎么更新模板缓存中的值
zfail:表示模板测试通过,深度测试失败时怎么更新模板缓存中的值。
zpass:表示 模板测试和深度测试都通过之后怎么设置模板缓存中的值。
深度测试:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GLenum func);
GL_GREATER,GL_LEQUAL,GL_GEQUAL,GL_EQUAL,GL_NOTEQUAL,GL_ALWAYS,GL_NEVER。
混合:
glEnable(GL_BLEND);
混合公式:
最后的颜色值=源因子*到来的颜色 OP 目的因子*在颜色缓存的值。
源因子和目的因子有一个函数指定:
glBlendFunc(GLenum sfactor,GLenum dfactor);
可以取这些值:
GL_ZERO
GL_ONE
GL_SRC_COLOR
GL_ONE_MINUS_SRC_COLOR
GL_SRC_ALPHA
GL_ONE_MINUS_SRC_ALPHA
GL_DST_COLOR
GL_ONE_MINUS_DST_COLOR
GL_DST_ALPHA
GL_ONE_MINUS_DST_ALPHA
GL_CONSTANT_COLOR
GL_ONE_MINUS_CONSTANT_COLOR
GL_SRC_ALPHA_SATURATE MIN(As,1-Ad) alpha取1.
这里有个GL_CONSTANT_COLOR,使用函数void glBlendColor(r,g,b,a);来指定。
OP使用这个函数来指定:
glBlendEquation(GLenum mode);
GL_FUNC_ADD,
GL_FUNC_SUBTRACT,
GL_FUNC_REVERSE_SUBTRACT. 这个取GL_FUNC_SUBTRACT结果的相反数。
抖动:
这个只有开启和关闭的函数,具体用的什么算法,依赖于设备。
读取颜色缓存中的值到内存:
void glReadPixels(x,y,width,height,format,type,void* pixels);