Framebuffer GL_EXTENSIONS检查

这段代码检查了系统是否支持多采样渲染到纹理,通过`GL_IMG_multisampled_render_to_texture`或`GL_EXT_multisampled_render_to_texture`扩展,并创建相应的帧缓冲对象,如果支持则设置多样本。
摘要由CSDN通过智能技术生成
```
const char *exts = (char*)glGetString(GL_EXTENSIONS);;
if(strstr(exts,"GL_IMG_multisampled_render_to_texture"))
{
    glRenderbufferStorageMultisampleIMG_ = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC)eglGetProcAddress ( "glRenderbufferStorageMultisampleIMG" );
    glFramebufferTexture2DMultisampleIMG_ = (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC)eglGetProcAddress ( "glFramebufferTexture2DMultisampleIMG" );
}
else if (strstr(exts,"GL_EXT_multisampled_render_to_texture"))
{
    glRenderbufferStorageMultisampleIMG_ = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC)eglGetProcAddress ( "glRenderbufferStorageMultisampleEXT" );
    glFramebufferTexture2DMultisampleIMG_ = (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC)eglGetProcAddress ( "glFramebufferTexture2DMultisampleEXT" );
}
bool Multisample = true;
if(glRenderbufferStorageMultisampleIMG_ != nullptr && glFramebufferTexture2DMultisampleIMG_ != nullptr) {
    Multisample = true;
    std::cout << "Multisample supported"<<std::endl;
} else {
    std::cout << "Multisample NOT supported"<<std::endl;
}
}

// create a color attachment texture
GLuint textureID = 0;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

// create a renderbuffer.
int CONST_SAMPLES = 4;
GLuint renderbuffer;
glGenRenderbuffers(1, &renderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
if(Multisample) {
    glRenderbufferStorageMultisampleIMG_(GL_RENDERBUFFER, CONST_SAMPLES, GL_DEPTH_COMPONENT16,  width, height);
} else {
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);
}

// create the framebuffer.
GLuint fbo;
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
if(Multisample) {
    glFramebufferTexture2DMultisampleIMG_(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0, CONST_SAMPLES);
} else {
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0);
}
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer);

if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
     std::cout << " Create Framebuffer Failed"<<std::endl;
    glDeleteFramebuffers(1, &fbo);
    glDeleteTextures(1, &textureID);
    glDeleteRenderbuffers(1, &renderbuffer);
}   
glBindTexture(GL_TEXTURE_2D, 0);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
```
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值