本文介绍常见测试和任意剪裁平面:剪裁测试、Alpha测试、模板测试和任意剪裁平面.

1.1 剪裁测试

剪裁测试,用来在渲染场景时限制绘制区域,实现同时在屏幕上绘制主视角与次视角场景。

1.1.1 剪裁测试原理

启用剪裁测试后,绘制将会在指定矩形区域进行,不在此区域内的片元会被丢弃,在区域内的片元进入帧缓冲。

1.1.2 核心代码

 GLES20.glEnable(GLES20.GL_SCISSOR_TEST);//启用剪裁测试GLES20.glScissor(0, 0, 230, 200);//设置区域GLES20.glDisable(GLES20.GL_SCISSOR_TEST);//禁用剪裁测试

1.2 Alpha测试

Alpha测试可以实现任意形状绘制区域的。

1.2.1 Alpha测试原理

OpenGL ES中每个颜色都有4个通道————RGBA,A代表了透明度(Alpha)通道。当绘制一个片元时,首先检测其Alpha值,若Alpha值满足要求,则通过测试,绘制此片元,否则丢弃此片元,不进行绘制。

1.2.2 编程实现

OpenGL ES 2.0中没有支持Alpha测试的API,我们需要通过自定义着色器来实现Alpha测试。如下所示:

precision mediump float;
varying vec2 vTextureCoord; //接收从顶点着色器过来的参数
uniform sampler2D sTexture;//纹理内容数据
void main() {vec4 bcolor = texture2D(sTexture, vTextureCoord);//给此片元从纹理中采样出颜色值if(bcolor.a<0.6) {discard;//丢弃当前片元} else {gl_FragColor=bcolor;}
}

上面代码中的“discard”操作即为丢弃当前片元。

1.3 模板测试

想要将绘制限定在某一不规则区域内,可以采用本节学习的模板测试。

1.3.1 模板测试原理

模板测试就是通过模板缓冲中记录的模板信息来完成。渲染管线在模板缓冲区中为每个位置的片元保存了一个“模板值”,当像素需要进行模板测试时,将设定的模板参考值与该片元对应位置的模板值进行比较,符合条件的片元通过测试,不符合条件的则被丢弃,不进行渲染。

1.3.2 核心代码

            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);//禁用模板测试

1.3.3 模板测试的比较模式

上述代码中“GLES20.glStencilFunc(GLES20.GL_ALWAYS,1,1)”第一个参数“GLES20.GL_ALWAYS”是比较模式参数,它包括下表所示的8种:

比较模式 含义
GL_NEVER 从不通过模板测试
GL_ALWAYS 总是通过模板测试
GL_LESS 只有参考值<(模板缓冲区的值&mask)时才通过
GL_LEQUAL 只有参考值<=(模板缓冲区的值&mask)时才通过
GL_EQUAL 只有参考值=(模板缓冲区的值&mask)时才通过
GL_GEQUAL 只有参考值>=(模板缓冲区的值&mask)时才通过
GL_GREATER 只有参考值>(模板缓冲区的值&mask)时才通过
GL_NOTEQUAL 只有参考值!=(模板缓冲区的值&mask)时才通过

表中“&”代表位与操作。

1.3.4 glStencilOp(…)参数含义

  • 参数1表示模板测试未通过时此片元对应的模板值如何变化;
  • 参数2表示模板测试通过,但深度测试未通过时此片元对应的模板值如何变化(没有启用深度测试,默认深度测试总是通过);
  • 参数3表示模板测试和深度测试均通过时此片元对应的模板值如何变化

3个参数可选值参考表:

参数值 模板值变化情况
GL_KEEP 不改变
GL_ZERO 回零
GL_REPLACE 使用测试条件中的设定值来代替当前模板值
GL_INCR 增加1,但如果已经是最大值,则保持不变
GL_NCR_WRAP 增加1,但如果已经是最大值,则重新从零开始
GL_DECR 减少1,但如果已经是零,则保持不变
GL_DECR_WRAP 减少1,但如果已经是零,则重新设置为最大值
GL_INVERT 按位取反

1.4 任意剪裁平面

仅绘制某一特定平面所确定半空间中的物体部分,其他部分不绘制,如同切掉物体一部分一样。

1.4.1 基本原理

用户可以指定任意一个平面进行剪裁,剪裁平面可以用于删除场景中无关的物体部分,比如显示物体的剖面图。

OpenGL ES 2.0中想要实现任意剪裁平面需要在片元着色器中通过编程实现。

  1. 定义剪裁平面参数A、B、C、D,4个参数代表平面解析方程(Ax+By+Cz+D=0)中的4个系数;
  2. 剪裁平面4个参数传入渲染管线,给着色器使用;
  3. 顶点着色器中判断顶点是否在平面的某一侧(使用平面方程验证),完成计算得到的值传入片元着色器
  4. 片元着色器根据接收到的值与0之间的关系得到顶点与剪裁平面之间的位置关系,以决定是否丢弃片元。

若Ax+By+Cz+D>0,则顶点在平面的一侧,反之在另一侧。

【参考】

  1. https://www.khronos.org/opengles/
  2. 《OpenGL ES应用开发实践指南 Android卷 Kevin Brothaler》
  3. https://en.wikipedia.org/wiki/OpenGL_ES
  4. https://developer.android.google.cn/guide/topics/graphics/opengl
  5. https://developer.android.google.cn/training/graphics/opengl
  6. 《Android3D游戏开发技术宝典OpenGL ES 2.0》
  7. 字节流动OpenGL ES开发极简教程

OpenGL ES学习(8)——剪裁测试认识相关推荐

  1. Android OpenGL ES 学习(二) -- 图形渲染管线和GLSL

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  2. 【eoe特刊】第二十七期 OpenGL ES学习及项目解析

    经过一个月征稿.编辑,新的一版特刊终于出炉了. 本次特刊的制作,改变以往的制作方式,完全取自网友的独自的风格. 在只有一个主题的前提下,完全是通过社区的热心的网友,根据自己的想法,自行设计,自由发挥, ...

  3. Android OpenGL ES 学习(十一) –渲染YUV视频以及视频抖音特效

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  4. Android OpenGL ES 学习(六) – 使用 VBO、VAO 和 EBO/IBO 优化程序

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  5. Android OpenGl Es 学习(二):定义顶点和着色器

    概述 这是一个新的系列,学习OpengGl Es,其实是<OpenGl Es 应用开发实践指南 Android卷>的学习笔记,感兴趣的可以直接看这本书,当然这个会记录自己的理解,以下只作为 ...

  6. Android OpenGL ES 学习(十) – GLSurfaceView 源码解析GL线程以及自定义 EGL

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  7. Android OpenGL ES 学习(九) – 坐标系统和实现3D效果

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  8. Android OpenGL ES 学习(五) -- 渐变色

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  9. Android OpenGL ES 学习(十二) - MediaCodec + OpenGL 解析H264视频+滤镜

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

最新文章

  1. Git相关二三事(git reflog 和彩色branch)【转】
  2. Jquery的跨域传输数据(JSONP)
  3. 中国产业园区发展动态及前景趋势规划建议报告2022-2028年版
  4. LeetCode——双指针
  5. HTML5营销代理商设计机构网站模板
  6. 实体属性变更历史记录框架(一)-变更历史记录从此无忧
  7. SpringBoot整合MyBatis(七)
  8. 第二工业大学计算机应用大专录取分,二工大| 2018年上海第二工业大学专科层次依法自主招生各专业最低录取分数线...
  9. Axure R8学习记录
  10. Alpha版本冲刺(六)
  11. 使用kermit串口工具时出现 /dev/ttyS0 is not a terminal device 错误
  12. 【英文命名】星座、奢侈品、深海物种相关英语词汇帮助你命名
  13. APP开发的上线流程
  14. 美团java一面面经
  15. pgr_createTopology正运行时卡死的解决
  16. 致远SPM解决方案之合同管理
  17. js简单实现拦截访问指定网址
  18. 蓝牙对战的java_国际象棋-可蓝牙对战
  19. Selenium 入门
  20. Python曲线肘部点检测-膝部点自动检测

热门文章

  1. 基于阿里云的短信接口的工具类及三个jar包下载地址
  2. (转)活出自己的生命
  3. WEB安全之HTML基础
  4. Vol . 2 游戏音乐的制作流程
  5. Python读取dta数据(自己学习专用)
  6. 分析扁平线圈特斯拉模块电路
  7. 图像处理(用计算机对图像进行处理的技术)
  8. 黑马JAVA P134 Set系列集合、Collection体系的总结
  9. 【《C Primer Plus》读书笔记】第8章:字符输入/输出和输入验证
  10. 美国人口普查数据预测收入sklearn算法汇总3之ROC: KNN,LogisticRegression,RandomForest,NaiveBayes,StochasticGradientDece