首页
学习
活动
专区
工具
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 因为Android中的GLSurfaceView的操作,其实都是在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() } }   其他代码我之前的文章中有写

    24510

    TRTCSDK自定义采集Texture2D视频通话

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

    1.4K41

    Android OpenGL ES入门

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

    36010

    TRTCSDK自定义采集Texture2D视频通话

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

    1.3K40

    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.6K10

    TRTCSDK自定义采集Texture2D视频通话

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

    1.7K60

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

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

    13.1K124

    OpenGL ES简介

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

    1.9K50

    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

    音视频开发之旅(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简介

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

    2K70

    OpenGL ES for Android 播放视频

    那是因为使用OpenGL ES可以做更多的酷炫的动效,比如旋转视频、双指缩放视频、视频的截图、视频的录制、直播、换脸,还有类似“激萌”App里面的特效等这些都是VideoView所无法实现的,而通过OpenGL...片段shader中u_Texture是纹理,注意它的类型是samplerExternalOES,并不是sampler2D,sampler2D是2D纹理,用于显示图片,而samplerExternalOES...OpenGL ES 纹理过滤模式-glTexParameteri。...frameAvailableListener,这个时候我们就会更新数据并绘制,在前面的文章我们介绍过在RenderMode=GLSurfaceView.RENDERMODE_WHEN_DIRTY模式下重新绘制需要调用...glSurfaceView.requestRender(),因此我们在Activity中实现了frameAvailableListener,并将此实现传递给Renderer,代码如下: class VideoActivity

    1.4K20

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券