剪裁测试
基本原理:用于渲染时限制绘制区域,通过此技术可以再屏幕(帧缓冲)指定一个矩形区域。启用剪裁测试之后,不在此矩形区域内的片元被丢弃,只有在此矩形区域内的片元才有可能进入帧缓冲。因此实际达到的效果就是在屏幕上开辟了一个小窗口,可以再其中进行指定内容的绘制。
核心代码如下:
GLES20.glEnable(GLES20.GL_SCISSOR_TEST);//启用剪裁测试
GLES20.glScissor(0,0,100,200);//设置区域(左下角坐标(0,0),宽度100,高度200)
GLES20.glDisable(GLES20.GL_SCISSOR_TEST);//禁用剪裁测试
Alpha测试
剪裁测试的区域只能是矩形,Alpha测试可以实现任意形状绘制区域。
基本原理:当绘制一个片元时,首先检测其Alpha值,若Alpha值满足要求,则通过测试,绘制此片元,否则丢弃其片元。
核心代码如下:
precision mediump float;//给出默认的浮点精度
varing vec2 vTextureCoord; //从顶点着色器传递过来的纹理坐标
uniform sampler2D sTexture;//纹理内容数据
void main{
vec4 bcolor = texture2D(sTexture,vTextureCoord);//根据纹理坐标采样出颜色值
if(bcolor.a < 0.6){discard;}//若Alpha值小于0.6,将片元丢弃
else{gl_FragColor = bcolor;}//否则将此颜色作为片元的颜色
}
模板测试
基本原理:可以将绘制限定在一个矩形的区域,模板测试也称蒙版测试。
核心代码如下:
GLES20.glClear(GLES20.GL_STENCIL_BUFFER_BIT);//清除模板缓冲
GLES20.glEnable(GLES20.GL_STENCIL_TEST);//启用模板测试
GLES20.glStencilFunc(GLES20.GL_ALWAYS, 1, 1);//设置模板测试参数
GLES20.glStencilOp(GLES20.GL_KEEP,GLES20.GL_KEEP,GLES20.GL_REPLACE);//设置模板测试后参数
GLES20.glDisable(GLES20.GL_STENCIL_TEST);//禁用模板测试
方法glStencilFunc中第一个参数为比较模式,第二个参数为参考值,第三个参数为掩码。
never:从不通过模板测试
always:总是通过模板测试
less:小于
equal:等于
greater:大于
notequal:不等于
方法glStencilOp中第一个参数表示模板测试不通过片元的模板值该如何变化,第二个参数表示深度测试不通过片元的模板值该如何变化,第三个参数表示模板测试和深度测试均未通过片元的模板值该如何变化
keep:不改变
zero:归零
replace:使用测试条件的设定值代替当前模板值
incr:+1,如果是最大值,保持不变
incr_wrap:+1,如果是最大值,充零开始
decr:-1,如果已经为零,则保持不变
invert:按位取反