Android OpenGL ES详解——裁剪Scissor

目录

一、概念

二、如何使用

1、开启裁剪测试

2、关闭裁剪测试

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

4、裁剪应用举例

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

四、源码下载


一、概念

定义1:

裁剪是OpenGL中提⾼渲染的⼀种方式,只刷新屏幕上发生变化的部分,OpenGL 允许将要进⾏渲染的窗⼝中指定⼀个裁剪框。

基本原理:⽤于渲染时限制绘制区域,通过此技术可以在屏幕(帧缓冲)指定一个矩形区域。启⽤剪裁测试之后,不在此矩形区域内的片元被丢弃,只有在此矩形区域内的片元才有可能进入帧缓冲。因此实际达到的效果就是在屏幕上开辟了了一个小窗⼝,可以再其中进行行指定内容的绘制。

定义2:

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

定义3:

剪裁测试主要用来在渲染场景时限制绘制区域,用其可以方便地实现同时在屏幕上绘制主视角与次视角场景;

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

二、如何使用

1、开启裁剪测试

java 复制代码
glEnable(GL_SCISSOR_TEST);

2、关闭裁剪测试

java 复制代码
 glDisable(GL_SCISSOR_TEST);

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

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

4、裁剪应用举例

Kotlin 复制代码
package com.example.scissordemo

import android.content.Context
import android.opengl.GLES30
import android.opengl.GLSurfaceView.Renderer
import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10

class ScissorRenderer(context: Context) : Renderer {
    private var mScreenWidth = 0
    private var mScreenHeight = 0
    private var mScissorWidth = 1000
    private var mScissorHeight = 800

    override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
    }

    override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
        GLES30.glViewport(0, 0, width, height)
        mScreenWidth = width
        mScreenHeight = height
        mScissorWidth = mScreenWidth / 2
        mScissorHeight = 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

相关推荐
二流小码农14 小时前
鸿蒙开发:自定义一个圆形动画菜单
android·ios·harmonyos
wniuniu_14 小时前
object->osd
android·java·数据库
封妖九禁苍天泣14 小时前
Android WebView 使用本地字体-WebViewAssetLoader
android
starrycode88814 小时前
【每日一个知识点】Kotlin基础语法核心学习笔记
笔记·学习·kotlin
00后程序员张15 小时前
fastlane 结合 appuploader 命令行实现跨平台上传发布 iOS App
android·ios·小程序·https·uni-app·iphone·webview
2501_9151063215 小时前
iOS 性能优化这件事,结合多工具分析运行期性能问题
android·ios·性能优化·小程序·uni-app·cocoa·iphone
千里马学框架15 小时前
如何使用豆包手机的READ_FRAME_BUFFER权限截图密码画面
android·智能手机·framework·安卓framework开发·权限·截图·secure
游戏开发爱好者815 小时前
App Store 上架流程,结合多工具协作
android·ios·小程序·https·uni-app·iphone·webview
阿道夫小狮子15 小时前
android 音频抢占问题
android·音视频
撩得Android一次心动15 小时前
Android 四大组件——Service(服务)【基础篇1】
android·服务·四大组件