OpenGL ES学习教程 --- FBO

OpenGL ES学习教程 — FBO

简介之什么是FBO

Frame Buffer Object帧缓冲对象,按照之前的学习绘制图像、纹理,着色器着色后最后一步,会将所有的数据都传给FBO,然后在屏幕上显示,只不过没使用自定义FBO之前都是使用默认的FBO,这个FBO id为0;使用我们自定义的FBO,绑定激活后,后续的渲染操作都会传递到这个FBO上,而且这个FBO不会显示屏幕上,我们可以对这个FBO内部存储的数据进行自己的操作,适合一些不需要显示屏幕上、突破屏幕尺寸的需求工作,也就是所谓的离屏渲染

FBO本身是没有分配渲染的内存,它更像一个资源的管理者,提供一些附着点,让纹理和渲染缓存(Render Buffer)附着,提供渲染;FBO实现有两种方式,一种是EGL实现 ,另一种是使用GLSurfaceView实现,本文以GLSurfaceView方式来阐述

今天没有心情写了,直接贴核心源码

创建

	public static int getFramBufferId(){
    
    
        int fboId[] = new int[1];
        GLES20.glGenFramebuffers(1, fboId, 0);

        return fboId[0];
    }

激活FBO

这一步很重要,之前我总是搞混 GL_FRAMEBUFFER相当于一个激活的变量,应该只有一个才能激活,当前fbo被激活了, 后续对Render的渲染都会把数据放到这个fbo,所有对像素数据的读写操作都在这个fbo, 如果不需要在此fbo操作,要解除绑定,并切换使用以下同一个方法切换绑定

		int fboId = GLHelper.getFramBufferId();
        /**
         * 这一步很重要,之前我总是搞混
         * GL_FRAMEBUFFER相当于一个激活的变量,应该只有一个才能激活,当前fbo被激活了,
         * 后续对Render的渲染都会把数据放到这个fbo,所有对像素数据的读写操作都在这个fbo,
         * 如果不需要在此fbo操作,要解除绑定,并切换使用以下同一个方法切换绑定
         */
        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture[1]);

绑定

		texture = GLHelper.loadTexture(context, bitmap);
		GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture[1]);
        //纹理作为颜色附着在FBO上
        GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
                GLES20.GL_TEXTURE_2D, texture[1], 0);
        //创建render buffer并绑定
        GLES20.glGenRenderbuffers(1, fRender, 0);
        GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, fRender[0]);
        GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16,
                imgWidth, imgHeight);
        GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT,
                GLES20.GL_RENDERBUFFER, fRender[0]);

以上要使用GLSurfaceView才能创建使用FBO,经过上面的配置,进行常规的纹理、图元绘制就会绘制到FBO上去了,而不会在屏幕上显示

最后,献上我的demo

猜你喜欢

转载自blog.csdn.net/jackzhouyu/article/details/96272118