Android OpenGL ES详解——裁剪Scissor

目录

一、概念

二、如何使用

1、开启裁剪测试

2、关闭裁剪测试

3、指定裁剪窗口(位置和大小)

4、裁剪应用举例

三、窗口、视⼝和裁剪区域三者区别

四、源码下载


一、概念

定义1:

裁剪是OpenGL中提⾼渲染的⼀种方式,只刷新屏幕上发生变化的部分,OpenGL 允许将要进⾏渲染的窗⼝中指定⼀个裁剪框。
基本原理:⽤于渲染时限制绘制区域,通过此技术可以在屏幕(帧缓冲)指定一个矩形区域。启⽤剪裁测试之后,不在此矩形区域内的片元被丢弃,只有在此矩形区域内的片元才有可能进入帧缓冲。因此实际达到的效果就是在屏幕上开辟了了一个小窗⼝,可以再其中进行行指定内容的绘制。

定义2:

裁剪是一种提高渲染性能的方法是只刷新屏幕上发生变化的部分。我们可能还需要将 OpengGL 渲染限制在窗口中一个较小的矩形区域(剪裁框)中。裁剪测试 是片元可见性判断的第一个附加测试。 默认情况下,剪裁框与窗口同样大小,并且不会进行 裁剪测试我们可以使用几乎处处都会用到的 glEnable 函数开启裁剪测试。

定义3:

剪裁测试主要用来在渲染场景时限制绘制区域,用其可以方便地实现同时在屏幕上绘制主视角与次视角场景;
剪裁测试可以在渲染时用来限制绘制区域,通过此技术可以在屏幕(帧缓冲)上指定一个矩形区域,启用剪裁测试后,绘制将不会在整个屏幕(帧缓冲)中进行,而是仅在指定的矩形区域中进行;不在此矩形区域内的片元将被丢弃,只有在此矩形区域内的片元才有机会最终进入帧缓冲;

二、如何使用

1、开启裁剪测试

glEnable(GL_SCISSOR_TEST);

2、关闭裁剪测试

 glDisable(GL_SCISSOR_TEST);

3、指定裁剪窗口(位置和大小)

//x,y:指定裁剪框左下⻆位置; width , height:指定裁剪尺⼨
void glScissor(Glint x,Glint y,GLSize width,GLSize height);

4、裁剪应用举例

package com.example.scissordemoimport android.content.Context
import android.opengl.GLES30
import android.opengl.GLSurfaceView.Renderer
import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10class ScissorRenderer(context: Context) : Renderer {private var mScreenWidth = 0private var mScreenHeight = 0private var mScissorWidth = 1000private var mScissorHeight = 800override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {}override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {GLES30.glViewport(0, 0, width, height)mScreenWidth = widthmScreenHeight = heightmScissorWidth = mScreenWidth / 2mScissorHeight = mScreenHeight / 2}override fun onDrawFrame(gl: GL10?) {//设置全屏默认颜色GLES30.glClearColor(0.0f, 0.0f, 1.0f, 0.0f)GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT)//开启裁剪测试GLES30.glEnable(GLES30.GL_SCISSOR_TEST)//设置屏幕中间红色裁剪区域GLES30.glScissor(mScreenWidth / 2 - mScissorWidth / 2,mScreenHeight / 2 - mScissorHeight / 2,mScissorWidth,mScissorHeight)GLES30.glClearColor(1.0f, 0.0f, 0.0f, 0.0f)//设置裁剪区颜色为红色GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT)//开启清屏,执行裁剪(把屏幕颜色清除成当前设置清除颜色)//设置绿色裁剪区域GLES30.glScissor(mScreenWidth / 2 - mScissorWidth / 4,mScreenHeight / 2 - mScissorHeight / 4,mScissorWidth / 2,mScissorHeight / 2)GLES30.glClearColor(0.0f, 1.0f, 0.0f, 0.0f)// 设置清屏颜色为绿色GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);//关闭裁剪测试GLES30.glDisable(GLES30.GL_SCISSOR_TEST)}
}

效果图如下:

裁剪应用演示demo源码下载:https://download.csdn.net/download/github_27263697/89938270

三、窗口、视⼝和裁剪区域三者区别

  • 窗⼝

就是显示界⾯

  • 视⼝

就是窗口中⽤来显示图形的一块矩形区域,它可以和窗口等大,也可以⽐窗口⼤或者小。只有绘制在视口区域中的图形才能被显示,如果图形有一部分超出了视口区域,那么那⼀部分是看不到的。通过glViewport()函数设置。

  • 裁剪区域(平行投影)

就是视口矩形区域的最小最大x坐标(left,right)和最小最大y坐标 (bottom,top),而不是窗口的最⼩最大x坐标和y坐标。通过glOrtho()函数设置,这个函数还需指定最近最远z坐标,形成⼀个⽴体的裁剪区域。

四、源码下载

裁剪应用演示demo源码下载:https://download.csdn.net/download/github_27263697/89938270

推荐文章

OpenGL ES 入门之旅--OpenGL下的深度缓冲区,隐藏面消除 - 简书

https://juejin.cn/post/6844903956087308295

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

江协科技STM32学习- P22 实验-ADC单通道/ADC多通道

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

【数据结构】树-二叉树-堆(下)

🍃 如果觉得本系列文章内容还不错,欢迎订阅🚩 🎊个人主页:小编的个人主页 🎀 🎉欢迎大家点赞👍收藏⭐文章 ✌️ 🤞 🤟 🤘 🤙 👈 &…

-XSS-

链接 https://github.com/do0dl3/xss-labs 搭建过程非常容易的 搭建好之后,就可以点击图片开始闯关了 第一关--JS弹窗函数alert() 显示payload的长度是4 level1.php?nametest level1.php?nametest1 发现只要改变name的值就显示什么在页面上 没有什么过滤的 …

【数据结构与算法】《Java 算法宝典:探秘从排序到回溯的奇妙世界》

目录 标题:《Java 算法宝典:探秘从排序到回溯的奇妙世界》一、排序算法1、冒泡排序2、选择排序3、插入排序4、快速排序5、归并排序 二、查找算法1、线性查找2、二分查找 三、递归算法四、动态规划五、图算法1. 深度优先搜索(DFS)2…

transformControls THREE.Object3D.add: object not an instance of THREE.Object3D.

把scene.add(transformControls);改为scene.add(transformControls.getHelper());

计算机视觉专栏(1)【LeNet】论文详解

Lenet 系列 论文精讲部分0.摘要1.引言2.CNN3.结果分析4.总结 论文精讲部分 本专栏旨在深入解析计算机视觉模型的论文及其发展背景,并通过代码部分的实际实验来加深理解。读者可以根据自己的需要参考其中的内容。其主体为原文,笔者理解内容会采用引用格式…

[ 问题解决篇 ] 解决windows虚拟机安装vmtools报错-winserver2012安装vmtools及安装KB2919355补丁 (附离线工具)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

Window on ARM解锁所有的TTS语音包供python调用

Window on ARM解锁所有的TTS语音包供python调用 可用的语音包查看查看TTS可用的语音包解锁语音包设置升级系统打开注册表导出注册表修改注册表导入新的注册表可用的语音包查看 微软的Windows 10操作系统为设备上安装的每种语言提供了一套语音。但只有部分已安装的语音能在整个…

EPLAN创建宏并自定义部件库详细案例操作(三)

#通过导入EDZ格式部件库的样式,模仿制作一个自定义的部件库# 续 EPLAN创建宏并自定义部件库详细案例操作(二) 需要部件库文件(EDZ)格式,可以在此下载: https://download.csdn.net/download/weixin_44166380/89935582 五、创建部件库 本章节的部分操作忽略,具体可参见…

电子电气架构 --- 车载芯片现状

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧…

我docker拉取mysql镜像时用的是latest,我该怎么看我的镜像版本是多少?可以通过一下三种方法查看

我docker拉取mysql镜像时用的是latest,我该怎么看我的镜像版本是多少? 方法一:查看 Docker 镜像标签 你可以查看 Docker 镜像的标签信息,了解当前使用的 MySQL 镜像版本。 具体步骤如下: 1. 列出本地 Docker 镜像&am…

识别风险的提示清单

在PMBOK(《项目管理体系指南》)中,介绍了这样一个概念,在识别风险时,可以提供一个参考清单,让大家基于一个清单来思考,这个项目可能有哪些具体的风险。 PMBOK中的风险提示清单,包括…

Unreal Engine 5 C++(C#)开发:使用蓝图库实现插件(二)编辑BPLibrary.h中的枚举及结构体

目录 引言 一、头文件编写 1.1Kismet/BlueprintFunctionLibrary.h 1.2BPLibrary.generated.h的作用 1.3IImageWrapper.h 1.4 IImageWrapperModule.h 1.5 Engine/Texture2D.h 1.6CoreMinimal.h 二、定义图片/路径类型的枚举 2.1图片枚举类EImageType 2.2路径枚举类EPath…

Vuestic 整理使用

简单示例 1. 条件渲染 2. 列表渲染 3. 组件插槽 4. 插值语法 5. 前后端路由的区别(还是转一下,可以减少代码量)SFC 构建 … … Okay,可以干活了,通顺 数据表的操作更加简化了 数据类别通过后端路由区别,但是还得由前端路由转一下 简单了许多呀,上脚手…

ssm017网上花店设计+vue(论文+源码)_kaic

设计题目:网上花店的设计与实现 摘 要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信…

网页上视频没有提供下载权限怎么办?

以腾讯会议录屏没有提供下载权限为例,该怎么办呢? 最好的办法就是找到管理员,开启下载权限。如果找不到呢,那就用这个办法下载。 1.打开Microsoft Edge浏览器的扩展 2.搜索“视频下载”,选择“视频下载Pro” 3.点击“…

使用pyecharts绘制词云图

一、什么是词云图? 词云图是一种用来展现高频关键词的可视化表达,通过文字、色彩、图形的搭配,产生有冲击力地视觉效果,而且能够传达有价值的信息。 制作词云图的网站有很多,简单方便,适合小批量操作。 …

一、ARMv8寄存器之通用、状态、特殊寄存器

ARMV8核心寄存器数量是非常大的,为了更好的学习,可以划分为以下几大类: 通用寄存器。这类寄存器主要是用来暂存数据和参与运算。通过load\store指令操作。状态寄存器。AArch64体系结构使用PSTATE寄存器表示当前处理器状态。特殊寄存器。有专门…

云渲染突破酒店3D动画渲染速度与成本瓶颈!

3D动画已经成为众多行业,尤其是酒店业,用于营销和展示其独特卖点的重要工具。通过生动的3D动画,酒店能够突出其特色和优势,从而吸引更多潜在客户。然而,在3D动画制作过程中,渲染环节往往是一个耗时且技术要…

LabVIEW偏振调制激光高精度测距系统

在航空航天、汽车制造、桥梁建筑等先进制造领域,许多大型零件的装配精度要求越来越高,传统的测距方法在面对大尺寸、高精度测量时,难以满足工业应用的要求。绝对测距技术在大尺度测量上往往会因受环境影响大、测距精度低而无法满足需求。基于…