本文主要是介绍OpenGL ES 2.0 - 几种剪裁与测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
OpenGL ES 2.0 - 几种剪裁与测试
剪裁测试
剪裁测试可以在渲染时用来限制绘制区域,通过此技术可以在屏幕(帧缓冲)上指定一个矩形区域.
不在此矩形区域内的片元将被丢弃,只有在矩形区域内的片元才有机会最终进入帧缓冲.
代码
GLES20.glEnable(GL10.GL_SCISSOR_TEST);//启用剪裁测试
GLES20.glScissor(0,//剪裁区域左下角X坐标200,//剪裁区域左下角Y坐标100,//剪裁区域的宽度200//剪裁区域的高度(以上单位:像素));
GLES20.glDisable(GL10.GL_SCISSOR_TEST);//禁用剪裁测试
Alpha测试
剪裁测试的区域只能是矩形.Alpha测试是一种可以实现任意形状绘制区域的技术.
原理
当绘制一个片元时,首先检测其Alpha值,若Alpha值满足要求,则通过测试,绘制此片元,否则丢弃此片元.
Alpha测试之片元着色器代码
precision mediump float;//给出默认的浮点精度
varying vec2 vTextureCoord;//从顶点着色器传过来的纹理坐标
uniform sampler2D sTexture;//纹理内容数据
void main() {vec4 bcolor = texture2D(sTexture, vTextureCoord);//根据纹理坐标采样出颜色值if(bcolor.a < 0.6) {//若Alpha值小于0.6,将片元丢弃discard;//此操作的功能为丢弃当前片元.} 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);//禁用模板测试
模板测试的8种比较模式
比较模式 | 含义 |
---|---|
GL_NEVER | 从不通过模板测试 |
GL_ALWAYS | 总是通过模板测试 |
GL_LESS | 只有 参考值<(模板缓冲区的值&mask)是才通过 |
GL_LEQUAL | 只有 参考值<=(模板缓冲区的值&mask)是才通过 |
GL_EQUAL | 只有 参考值=(模板缓冲区的值&mask)是才通过 |
GL_GEQUAL | 只有 参考值>=(模板缓冲区的值&mask)是才通过 |
GL_GREATER | 只有 参考值>(模板缓冲区的值&mask)是才通过 |
GL_NOTEQUAL | 只有 参考值!=(模板缓冲区的值&mask)是才通过 |
任意剪裁平面 - 待日后研究
这篇关于OpenGL ES 2.0 - 几种剪裁与测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!