OpenGL之MRT

简单清晰
转载自:https://blog.csdn.net/linuxheik/article/details/78922220

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

1. 设置4个渲染目标

[cpp]  view plain  copy
  1. bool initFramebuffer(int w, int h)  
  2. {  
  3.     glGenRenderbuffers( 1, &g_DepthRenderBuffer);  
  4.     glBindRenderbuffer( GL_RENDERBUFFER, g_DepthRenderBuffer );  
  5.     glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, w, h);  
  6.     CHECK_GL_ERROR  
  7.   
  8.     glGenFramebuffers(1, &g_FrameBuffer);  
  9.     glBindFramebuffer(GL_FRAMEBUFFER, g_FrameBuffer);  
  10.     CHECK_GL_ERROR  
  11.   
  12.     for(int i = 0; i <= 3; ++i)  
  13.         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+i, GL_TEXTURE_2D, g_Texture2Ds[i], 0);  
  14.   
  15.     glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,g_DepthRenderBuffer );  
  16.     CHECK_GL_ERROR  
  17.   
  18.     GLenum DrawBuffers[4];  
  19.     DrawBuffers[0] = GL_COLOR_ATTACHMENT0;  
  20.     DrawBuffers[1] = GL_COLOR_ATTACHMENT1;  
  21.     DrawBuffers[2] = GL_COLOR_ATTACHMENT2;  
  22.     DrawBuffers[3] = GL_COLOR_ATTACHMENT3;  
  23.   
  24.     glDrawBuffers(4, DrawBuffers);  
  25.     CHECK_GL_ERROR  
  26.   
  27.     if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)  
  28.         return false;  
  29.   
  30. //  glBindFramebuffer( GL_FRAMEBUFFER, 0 );  
  31. //  glBindRenderbuffer( GL_RENDERBUFFER, 0 );  
  32.        
  33.     return true;  
  34. }  

2. 渲染到4个渲染目标

[cpp]  view plain  copy
  1. #version 300 es  
  2.   
  3. #ifdef GL_FRAGMENT_PRECISION_HIGH                                 
  4. precision highp float;                                        
  5. #else                                                 
  6. precision mediump float;                                      
  7. #endif    
  8.   
  9. #define FRAG_RED        0  
  10. #define FRAG_GREEN      1  
  11. #define FRAG_BLUE       2  
  12. #define FRAG_RGBA       3  
  13.   
  14.   
  15. in  vec3 vColor;  
  16. in  vec3 vPos;  
  17.   
  18. layout(location = FRAG_RED) out vec4 Red;  
  19. layout(location = FRAG_GREEN) out vec4 Green;  
  20. layout(location = FRAG_BLUE) out vec4 Blue;  
  21. layout(location = FRAG_RGBA) out vec4 RGBA;  
  22.   
  23. void main()  
  24. {  
  25.     vec4 Color = vec4(vColor, 1.0) * 0.7f;  
  26.     float light = 1.0 / (length(vPos)+0.5f);  
  27.     Red = vec4(Color.r * light, 0, 0, 1);  
  28.     Green = vec4(0, Color.g * light, 0, 1);  
  29.     Blue = vec4(0, 0, Color.b * light,1);  
  30.     RGBA = Color * light;  
  31. }  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值