OpenGL ES 3.0-Multiple Render Targets

来源:互联网 发布:手机广告语制作软件 编辑:程序博客网 时间:2024/09/21 06:17

MRT,多渲染对象,用来将场景同时渲染到多个目标中去。

1. 设置4个渲染目标

bool initFramebuffer(int w, int h){glGenRenderbuffers( 1, &g_DepthRenderBuffer);    glBindRenderbuffer( GL_RENDERBUFFER, g_DepthRenderBuffer );    glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, w, h);CHECK_GL_ERRORglGenFramebuffers(1, &g_FrameBuffer);glBindFramebuffer(GL_FRAMEBUFFER, g_FrameBuffer);CHECK_GL_ERRORfor(int i = 0; i <= 3; ++i)glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+i, GL_TEXTURE_2D, g_Texture2Ds[i], 0);glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,g_DepthRenderBuffer );CHECK_GL_ERRORGLenum DrawBuffers[4];DrawBuffers[0] = GL_COLOR_ATTACHMENT0;DrawBuffers[1] = GL_COLOR_ATTACHMENT1;DrawBuffers[2] = GL_COLOR_ATTACHMENT2;DrawBuffers[3] = GL_COLOR_ATTACHMENT3;glDrawBuffers(4, DrawBuffers);CHECK_GL_ERRORif(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)return false;//glBindFramebuffer( GL_FRAMEBUFFER, 0 );//glBindRenderbuffer( GL_RENDERBUFFER, 0 ); return true;}

2. 渲染到4个渲染目标

#version 300 es#ifdef GL_FRAGMENT_PRECISION_HIGHprecision highp float;#elseprecision mediump float;#endif#define FRAG_RED0#define FRAG_GREEN1#define FRAG_BLUE2#define FRAG_RGBA3invec3 vColor;in  vec3 vPos;layout(location = FRAG_RED) out vec4 Red;layout(location = FRAG_GREEN) out vec4 Green;layout(location = FRAG_BLUE) out vec4 Blue;layout(location = FRAG_RGBA) out vec4 RGBA;void main(){vec4 Color = vec4(vColor, 1.0) * 0.7f;float light = 1.0 / (length(vPos)+0.5f);Red = vec4(Color.r * light, 0, 0, 1);Green = vec4(0, Color.g * light, 0, 1);Blue = vec4(0, 0, Color.b * light,1);RGBA = Color * light;}