首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在GLSurfaceView中的onResume()之后重新加载opengl纹理

在GLSurfaceView中的onResume()之后重新加载opengl纹理,可以通过以下步骤来实现:

  1. 在GLSurfaceView的onResume()方法中,重新初始化OpenGL ES环境和资源。
  2. 在GLSurfaceView的onDrawFrame()方法中,重新加载纹理。
  3. 在GLSurfaceView的onSurfaceChanged()方法中,重新设置OpenGL ES视口和投影矩阵。

以下是一个简单的示例代码:

代码语言:java
复制
public class MyGLSurfaceView extends GLSurfaceView {
    private MyGLRenderer mRenderer;

    public MyGLSurfaceView(Context context) {
        super(context);
        setEGLContextClientVersion(2);
        mRenderer = new MyGLRenderer();
        setRenderer(mRenderer);
    }

    @Override
    public void onResume() {
        super.onResume();
        mRenderer.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        mRenderer.onPause();
    }

    private class MyGLRenderer implements GLSurfaceView.Renderer {
        private int mTexture;

        public void onResume() {
            // 重新初始化OpenGL ES环境和资源
            GLES20.glGenTextures(1, new int[]{mTexture}, 0);
            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTexture);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
            // 加载纹理
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.texture);
            GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
            bitmap.recycle();
        }

        public void onPause() {
            // 释放资源
            GLES20.glDeleteTextures(1, new int[]{mTexture}, 0);
        }

        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        }

        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            GLES20.glViewport(0, 0, width, height);
            float ratio = (float) width / height;
            Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
        }

        @Override
        public void onDrawFrame(GL10 gl) {
            GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
            // 绘制纹理
            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTexture);
            GLES20.glEnableVertexAttribArray(mPositionHandle);
            GLES20.glEnableVertexAttribArray(mTextureCoordHandle);
            GLES20.glVertexAttribPointer(mPositionHandle, 3, GLES20.GL_FLOAT, false, 0, mVertexBuffer);
            GLES20.glVertexAttribPointer(mTextureCoordHandle, 2, GLES20.GL_FLOAT, false, 0, mTextureCoordBuffer);
            GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, mIndexBuffer);
            GLES20.glDisableVertexAttribArray(mPositionHandle);
            GLES20.glDisableVertexAttribArray(mTextureCoordHandle);
        }
    }
}

在上述示例代码中,我们在GLSurfaceView的onResume()方法中重新初始化OpenGL ES环境和资源,并在GLSurfaceView的onDrawFrame()方法中重新加载纹理。在GLSurfaceView的onSurfaceChanged()方法中,我们重新设置OpenGL ES视口和投影矩阵。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Android OpenGL ES(一)-开始描绘一个平面三角形

    image.png 关于OpenGL ES Android介绍这里略过 OpenGL ES世界基本元素 着色器 坐标系。矩阵 纹理 ... 本文主要涉及部分是着色器使用。...直接开始 ---- 创建GLSurfaceView 今天目标是做一个OpenGL ES学习开端。就是画一个简单三角形。暂时不考虑坐标系矩阵变换和纹理等。只需要用顶点着色器简单来进行描述。...(); } } 绘制三角形-Render实现类 绘制基础知识 ---- GLThread 因为AndroidGLSurfaceView操作,其实都是GLThread...因为我们没有考虑空间转换,所以就不需要进行矩阵变化,暂时就直接使用三角形OpenGl坐标系就可以。 给定义数组,分配对应本地内存空间。...绘制图形过程,启用我们设置属性和变量,并且绘制套路 未知道: 坐标矩阵变化。和纹理等。

    1.4K20

    如何渲染最原始yuv视频数据?

    一.整体思路   我们在用纹理增加细节那篇文章中提到过,要将图片渲染在屏幕上,首先要拿到图片像素数组数据,然后将像素数组数据通过纹理单元传递到片段着色器,最后通过纹理采样函数将纹理对应坐标的颜色值采样出来...这个时候,之前学过纹理单元就可以派上用场了,我们可以定义3个纹理单元,分别读取yuv图像3个通道数据,最后片段着色器中进行合成,然后转化为RGBA值即可。...其实,GLSL,向量组件可以通过{x,y,z,w},{r,g,b,a}或{s,t,r,q}来获取,之所以采用这三个不同命名方法,是因为向量通常会用来表示数学向量,颜色和纹理坐标。...opengl es2.0编程,用于绘制顶点数组数据首先保存在cpu内存,调用glDrawArrays函数进行绘制时,需要将顶点数组数据从cpu内存拷贝到gpu显存。...override fun onResume() { super.onResume() glSurfaceView.onResume() } }   其他代码我之前文章中有写

    20910

    Android OpenGL ES入门

    地图和导航应用:需要呈现复杂地图、导航路径和地理信息应用OpenGL ES可以用于实现高性能地图渲染。...初始化OpenGL使用类是GLSurfaceView,它可以处理OpenGL初始化过程中比较基本操作,如配置显示设备,在后台线程渲染,渲染是显示设备中一个称为surface特定区域完成。...使用GLSurfaceView时候,我们要处理好Activity生命周期事件,Activity暂停时候要释放资源,Activity恢复时候要重新恢复资源。   ...super.onResume() if(rendererSet){ glSurfaceView.onResume() } } } package...onDrawFrame:当绘制一帧时,这个方法会被GLSurfaceView调用,在这个方法,我们一定要绘制一些东西,因为这个方法返回时,渲染缓冲区会被交换并显示屏幕上,如果什么都没有画,会看到糟糕闪烁效果

    32810

    TRTCSDK自定义采集Texture2D视频通话

    ,确定好顶点位置和图形颜色,将顶点和颜色数据转换为OpenGl使用数据格式 加载顶点着色器和片段着色器用来修改图形颜色,纹理,坐标等属性 创建程式(Program),连接顶点着色器片段着色器。...将坐标数据传入到OpenGl 程式: 2、安卓端OpenGL ES OpenGl一般用于图形工作站,PC端使用,由于性能各方面原因,移动端使用OpenGl基本带不动。...使用此方法作为主要执行点用于绘制(和重新绘制)图形对象。 系统调用此方法时GLSurfaceView几何形状变化,包括尺寸变化GLSurfaceView或设备屏幕取向。...OpenGL默认情况下,GLSurfaceView绘制结果是显示到屏幕上,但是实际情况中大部分时候都不需要渲染到屏幕中去,这个FBO就是来实现这个需求,FBO可以让不渲染到屏幕当中去,而是渲染到离屏...比如美颜操作、水印操作等,都需要处理纹理,将处理之后Texture2D纹理渲染出来。

    1.4K41

    TRTCSDK自定义采集Texture2D视频通话

    ) 创建图形类,确定好顶点位置和图形颜色,将顶点和颜色数据转换为OpenGl使用数据格式 加载顶点着色器和片段着色器用来修改图形颜色,纹理,坐标等属性 创建程式(Program),连接顶点着色器片段着色器...将坐标数据传入到OpenGl 程式: 2、安卓端OpenGL ES OpenGl一般用于图形工作站,PC端使用,由于性能各方面原因,移动端使用OpenGl基本带不动。...使用此方法作为主要执行点用于绘制(和重新绘制)图形对象。 系统调用此方法时GLSurfaceView几何形状变化,包括尺寸变化GLSurfaceView或设备屏幕取向。...OpenGL默认情况下,GLSurfaceView绘制结果是显示到屏幕上,但是实际情况中大部分时候都不需要渲染到屏幕中去,这个FBO就是来实现这个需求,FBO可以让不渲染到屏幕当中去,而是渲染到离屏...比如美颜操作、水印操作等,都需要处理纹理,将处理之后Texture2D纹理渲染出来。

    1.3K40

    TRTCSDK自定义采集Texture2D视频通话

    ,确定好顶点位置和图形颜色,将顶点和颜色数据转换为OpenGl使用数据格式 加载顶点着色器和片段着色器用来修改图形颜色,纹理,坐标等属性 创建程式(Program),连接顶点着色器片段着色器。...将坐标数据传入到OpenGl 程式: 2、安卓端OpenGL ES OpenGl一般用于图形工作站,PC端使用,由于性能各方面原因,移动端使用OpenGl基本带不动。...使用此方法作为主要执行点用于绘制(和重新绘制)图形对象。 系统调用此方法时GLSurfaceView几何形状变化,包括尺寸变化GLSurfaceView或设备屏幕取向。...OpenGL默认情况下,GLSurfaceView绘制结果是显示到屏幕上,但是实际情况中大部分时候都不需要渲染到屏幕中去,这个FBO就是来实现这个需求,FBO可以让不渲染到屏幕当中去,而是渲染到离屏...比如美颜操作、水印操作等,都需要处理纹理,将处理之后Texture2D纹理渲染出来。

    1.7K60

    OpenGL ES 3.0 | 围绕HelloTriangle实战案例 展开 渲染流程分析

    加载顶点、片段着色器 创建一个程序对象, 连接顶点、片段着色器, 并链接程序对象; 设置视口; 清除颜色缓冲区; 渲染简单图元 使颜色缓冲区内容EGL窗口表面(GLSurfaceView可见...着色器 OpenGL ES 3.0, 除非加载有效顶点和片段着色器,否则不会绘制任何几何形状; OpenGL ES 3.0程序必须至少有 一个顶点着色器 和 一个片段着色器; 着色器示例代码:...0, mWidth, mHeight ); 通知OpenGL ES 用于绘制2D渲染表面的原点、宽度和高度; OpenGL ES , 视口(Viewport) 定义所有 OpenGL ES...渲染操作 最终显示 2D矩形; 视口 由 原点坐标(x,y)和宽度、高度 定义; 清除颜色缓冲区 设置视口之后,需要清除屏幕; OpenGL ES, 绘图中涉及多种缓冲区类型:颜色、深度...GLES30.glClear()之前设置; 加载几何形状和绘制图元 加载几何形状 清除颜色缓冲区、设置视口和加载程序对象之后, 指定三角形几何形状; 三角形顶点由mVerticesData数组

    1.5K10

    Android OpenGL开发实践 - GLSurfaceView对摄像头数据再处理

    运行所需上下文环境,GLSurfaceView.Renderer三个回调方法就运行在OpenGL环境,省去了复杂和冗长OpenGL上下文环境创建过程。...和SurfaceView不同是,SurfaceTexture接收图像流之后,不需要显示出来。...要注意是,此方法只能在生成该纹理OpenGL线程调用,所以这个地方通过GLSurfaceViewqueueEvent方法将该调用放入GL线程队列执行。...除此之外,external OES纹理和Sampler2D使用时没有差别。 有了顶点着色器和片段着色器程序,我们怎么把它们加在OpenGL渲染管线运行起来呢?...OpenGL渲染管线,几何数据和纹理经过多次转化和多次测试,最后以二维像素形式显示屏幕上。OpenGL管线最终渲染目的地被称作帧缓存(framebuffer)。

    12.9K124

    OpenGL ES简介

    ESAndroid应用 为了让你控件能够显示界面上,你必须创建一个view作为容器。...OpenGL ES Android实例 1,Manifest声明使用OpenGLES 为了能使用OpenGLES 2.0 API,你必须在你manifest添加以下声明: <uses-feature...对于每个图元,必须确定它是否位于视椎体内(3维空间显示屏幕上可见区域),如果图元部分在视椎体,需要进行裁剪,如果图元全部视椎体外,则直接丢弃图元。裁剪之后,顶点位置转换成了屏幕坐标。...光栅化阶段产生颜色、深度、模板和屏幕坐标(Xw, Yw)成为流水线pre-fragment阶段(FragmentShader之后)输入。...片元着色器之后就是逐个片元操作阶段,包括一系列测试阶段。一个光栅化阶段产生具有屏幕坐标(Xw, Yw)片元,只能修改framebuffer(帧缓冲)位置(Xw, Yw)像素。

    1.8K50

    音视频开发之旅(41)-天空盒

    因此我们可以采用上面的原理,一个立方体进行立方体贴图 实际渲染,将这个立方体始终罩在摄像机周围,让摄像机始终处于这个立方体中心位置,然后根据视线与立方体交点坐标,来确定究竟要在哪一个面上进行纹理采样...具体映射方法为:设视线与立方体交点为(x,y,z)(x,y,z),x、y、zx、y、z取绝对值最大那个分量,根据它符号来判定在哪个面上采样。..., skyBoxTexture) GLES20.glUniform1i(uTextureLoc, 0) 立方体纹理贴图加载如下 /** * 加载立方体纹理贴图 *...gl_Position = uMatrix*vec4(aPosition, 1.0); //注意这里 gl_Position = gl_Position.xyww; } z = w 投影变换之后...这里说明下为什么采用旋转方式,而不是位移方式进行视角切换,因为我们不是一个平面,而是位于一个立方体中央,沿着某个方向(比如Y轴)进行选择,即可实现天空移动效果,如果采用位移方式看到是立方体移动

    1.1K20

    OpenGL ES简介

    ESAndroid应用 为了让你控件能够显示界面上,你必须创建一个view作为容器。...OpenGL ES Android实例 1,Manifest声明使用OpenGLES 为了能使用OpenGLES 2.0 API,你必须在你manifest添加以下声明: <uses-feature...对于每个图元,必须确定它是否位于视椎体内(3维空间显示屏幕上可见区域),如果图元部分在视椎体,需要进行裁剪,如果图元全部视椎体外,则直接丢弃图元。裁剪之后,顶点位置转换成了屏幕坐标。...光栅化阶段产生颜色、深度、模板和屏幕坐标(Xw, Yw)成为流水线pre-fragment阶段(FragmentShader之后)输入。...片元着色器之后就是逐个片元操作阶段,包括一系列测试阶段。一个光栅化阶段产生具有屏幕坐标(Xw, Yw)片元,只能修改framebuffer(帧缓冲)位置(Xw, Yw)像素。

    1.9K70

    Android校招笔试题

    开发要有一个回调类需要实现一个接口是( D) A. android.opengl.GLSurfaceView.OpenGL B. android.opengl.GLSurfaceView.Renderer...(可以采用重新开启子线程方式,然后使用Handler+Message方式做一些操作,比如更新主线程ui等) 2、应用程序应该避免BroadcastReceiver里做耗时操作或计算。...message,然后执行动作,可以再主线程和子线程互相传递数据 主线程创建之后会创建一个Looper对象,创建Looper对象时候会去创建一个messageQueue,而Looper是一个轮询器,...会不停轮询messageQueue消息,获取到消息之后就会把这个消息交给handler来进行处理,主线程创建一个handler对象,这个handler对象不仅可以获取到消息进行处理,也可以把一个消息放到消息队列...一个新启动线程重新绘制画面,主动更新画面。

    1.2K31

    Android openGl 绘制简单图形实现示例

    AndroidopenGL 如何使用? 了解OpenGl使用之前,我们需要了解两个基本类别的Android框架:GlSurfaceViewGlSurfaceView.Renderer 3....使用此方法作为主要执行点用于绘制(和重新绘制)图形对象。 系统调用此方法时GLSurfaceView几何形状变化,包括尺寸变化GLSurfaceView或设备屏幕取向。...为这个GlSurfaceView设置渲染 3. GlSurfaceView.renderer绘制处理显示数据 5....OpenGl简单使用实例(绘制一个三角形) 使用OpenGl之前,需要在AndroidManifest.xml设置OpenGl版本:这里我们使用OpenGl ES 2.0,所以需要添加如下说明...,将顶点和颜色数据转换为OpenGl使用数据格式 加载顶点找色器和片段着色器用来修改图形颜色,纹理,坐标等属性 创建投影和相机视图来显示视图显示状态,并将投影和相机视图转换传递给着色器。

    2.6K30

    android使用OPENGL ES绘制圆柱体

    本文实例为大家分享了android使用OPENGL ES绘制圆柱体具体代码,供大家参考,具体内容如下 效果图: ?...() { super.onResume(); mGLSurfaceView.onResume(); } @Override protected void onPause() { super.onPause...liuguodong on 2017/10/29. */ import java.io.IOException; import java.io.InputStream; import android.opengl.GLSurfaceView...,主要包括纹理、高度、截面半径、截面角度切分单位和高度切分单位,这些属性用于控制圆柱体大小 *定义各个圆柱体绘制类三角形绘制方法和工具方法 *实现圆柱体线性会执法,线性会执法和三角形会执法顶点获取方法相同...float z) { float pingfang=x*x+y*y+z*z; float length=(float) Math.sqrt(pingfang); return length; } //自动切分纹理产生纹理数组方法

    89940
    领券