```
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);
```
Framebuffer GL_EXTENSIONS检查
于 2024-04-15 17:50:31 首次发布
这段代码检查了系统是否支持多采样渲染到纹理,通过`GL_IMG_multisampled_render_to_texture`或`GL_EXT_multisampled_render_to_texture`扩展,并创建相应的帧缓冲对象,如果支持则设置多样本。
摘要由CSDN通过智能技术生成