OpenGL ES 2.0 - 几种剪裁与测试

2024-03-06 22:48
文章标签 es 测试 几种 opengl 2.0 剪裁

本文主要是介绍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 - 几种剪裁与测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/781618

相关文章

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

CSS去除a标签的下划线的几种方法

《CSS去除a标签的下划线的几种方法》本文给大家分享在CSS中,去除a标签(超链接)的下划线的几种方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧... 在 css 中,去除a标签(超链接)的下划线主要有以下几种方法:使用text-decoration属性通用选择器设置:使用a标签选择器,将tex

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python实现Microsoft Office自动化的几种方式及对比详解

《Python实现MicrosoftOffice自动化的几种方式及对比详解》办公自动化是指利用现代化设备和技术,代替办公人员的部分手动或重复性业务活动,优质而高效地处理办公事务,实现对信息的高效利用... 目录一、基于COM接口的自动化(pywin32)二、独立文件操作库1. Word处理(python-d

python中字符串拼接的几种方法及优缺点对比详解

《python中字符串拼接的几种方法及优缺点对比详解》在Python中,字符串拼接是常见的操作,Python提供了多种方法来拼接字符串,每种方法有其优缺点和适用场景,以下是几种常见的字符串拼接方法,需... 目录1. 使用 + 运算符示例:优缺点:2. 使用&nbsjsp;join() 方法示例:优缺点:3

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem