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)是才通过

任意剪裁平面 - 待日后研究

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值