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

相关推荐
长亭外的少年17 分钟前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
JIAY_WX20 分钟前
kotlin
开发语言·kotlin
建群新人小猿3 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神4 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛4 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
Y多了个想法5 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter6 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快7 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl7 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
麦田里的守望者江8 小时前
KMP 中的 expect 和 actual 声明
android·ios·kotlin