帧缓冲对象(FBO)

帧缓冲对象(FBO)是由颜色附件、深度附件、模板附件组成的,作为着色器各方面(一般包括颜色、深度、模板值)绘制结果存储的逻辑对象。渲染缓冲对象(Renderbuffer Object)是一个由应用程序分配的2D图像缓冲区,可以用于分配和存储颜色、深度或者模板值,可以用作帧缓冲区对象的颜色、深度或者模板附件。

帧缓冲包括三种可选的附件:颜色附件、深度附件、模板附件,具体情况如下所列。
1.颜色附件一般用纹理图来实现,也可以使用渲染缓冲对象实现。
2.深度附件有两个选择,可以采用纹理图,也可以采用渲染缓冲对象,本节案例采用的是渲染缓冲对象。
3.模板附件仅能采用渲染缓冲对象,用于进行模板测试。
初始化帧缓冲
int tia[]=new int[1];//用于存放产生的帧缓冲id的数组
GLES20.glGenFramebuffers(1, tia, 0);//产生一个帧缓冲id
frameBufferId=tia[0];//将帧缓冲id记录到成员变量中
//绑定帧缓冲id
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, frameBufferId);

// System.out.println(“glGetError -1 “+GLES20.glGetError());

    GLES20.glGenRenderbuffers(1, tia, 0);//产生一个渲染缓冲id
    renderDepthBufferId=tia[0];//将渲染缓冲id记录到成员变量中
    System.out.println("glGetError  -2  "+GLES20.glGetError());

// 绑定指定id的渲染缓冲
GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, renderDepthBufferId);
// 为渲染缓冲初始化存储
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER,
GLES20.GL_DEPTH_COMPONENT16,viewSizeX, viewSizeY);

// System.out.println(“glGetError 3 “+GLES20.glGetError());

    int[] tempIds = new int[1];//用于存放产生纹理id的数组
    GLES20.glGenTextures//产生一个纹理id
    (
            1,         //产生的纹理id的数量
            tempIds,   //纹理id的数组
            0           //偏移量
    );

    textureId=tempIds[0];//将纹理id记录到成员变量

// System.out.println(textureId+”glGetError 4 “+GLES20.glGetError());
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,textureId);//绑定纹理id
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,//设置MIN采样方式
GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,//设置MAG采样方式
GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,//设置S轴拉伸方式
GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,//设置T轴拉伸方式
GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexImage2D//设置颜色附件纹理图的格式
(
GLES20.GL_TEXTURE_2D,
0, //层次
GLES20.GL_RGBA, //内部格式
viewSizeX, viewSizeY,
0, //边界宽度
GLES20.GL_RGBA, //格式
GLES20.GL_UNSIGNED_BYTE,//每个像素数据格式
null
);
// System.out.println(“glGetError 5 “+GLES20.glGetError());
GLES20.glFramebufferTexture2D //设置自定义帧缓冲的颜色缓冲附件
(
GLES20.GL_FRAMEBUFFER,
GLES20.GL_COLOR_ATTACHMENT0, //颜色缓冲附件
GLES20.GL_TEXTURE_2D,
textureId, //纹理id
0 //层次
);
// System.out.println(“glGetError 6 “+GLES20.glGetError());
GLES20.glFramebufferRenderbuffer //设置自定义帧缓冲的深度缓冲附件
(
GLES20.GL_FRAMEBUFFER,
GLES20.GL_DEPTH_ATTACHMENT, //深度缓冲附件
GLES20.GL_RENDERBUFFER, //渲染缓冲
renderDepthBufferId //渲染深度缓冲id
);
// System.out.println(“glGetError 8 “+GLES20.glGetError());
// //===================test framebuffer bind success start===================
// if(GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER)==GLES20.GL_FRAMEBUFFER_COMPLETE)
// {
// System.out.println(“true=====================”);
// }else
// {
// System.out.println(“false=====================”);
// }
// //===================test framebuffer bind success end===================

opengl es 2.0绘制Andorid照相机渲染出的纹理,在使用到Framebuffer时,需实现两次绘制,第一次将纹理绘制到缓冲区,此时,片元着色器的实现如下

extension GL_OES_EGL_image_external : require

precision mediump float;
varying vec2 textureCoordinate;
uniform samplerExternalOES s_texture;
void main() {
gl_FragColor = texture2D( s_texture, textureCoordinate );
}
但是在进行第二次绘制时,片元着色器如下
precision mediump float;
varying vec2 textureCoordinate;
uniform sampler2D s_texture;
void main() {
gl_FragColor = texture2D( s_texture, textureCoordinate );
}
此时使用的纹理内容类型为sampler2D,因为在进行渲染到帧缓冲时,使用的是GL_TEXTURE_2D

你可能感兴趣的:(帧缓冲对象(FBO))