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

相关推荐
crmscs10 分钟前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob12 分钟前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔16 分钟前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei99617 分钟前
flutter和Android动画的对比
android·flutter·动画
lxysbly2 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首3 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节
消失的旧时光-19435 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
有位神秘人6 小时前
kotlin与Java中的单例模式总结
java·单例模式·kotlin
Jinkxs6 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&6 小时前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin