使用OpenGL FBO进行离线渲染。下面列出了创建FBO的主要代码片段:
glGenFramebuffers(1, &fbo);
// Create new framebuffers with new size.
int maxSize; glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &maxSize);
glGenRenderbuffers(1,&clrRbo)
glBindRenderbuffer(GL_RENDERBUFFER,clrRbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, (std::min)(maxSize,m_localvp.pix_width),(std::min)(maxSize, m_localvp.pix_height));
glGenRenderbuffers(1,&stencilRbo);
glBindRenderbuffer(GL_RENDERBUFFER,stencilRbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, (std::min)(maxSize,m_localvp.pix_width),(std::min)(maxSize, m_localvp.pix_height));
// Bind new framebuffers to FBO;
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, clrRbo);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, stencilRbo);
// Checke FBO status
checkFramebufferStatus();
上面的代码适用于某些图形硬件,但在其他图形硬件上失败。 glCheckFramebufferStatus()中报告的错误是GL_FRAMEBUFFER_UNSUPPORTED,这意味着颜色或模板格式的内部格式是不可渲染的。
如何在代码运行的图形硬件上获得正确的颜色或模板可渲染的内部格式?或者,如何在不同的OpenGL版本和硬件实现中使我的代码可移植?
我的研究:
答案 0 :(得分:2)
glGetInternalFormat()
是OpenGL 4.2中的新功能。在早期版本中无法获得相同的信息。
我不相信它会给你所有你需要的东西。虽然它提供了大量有关每种格式的信息,但看起来部分有助于此目的,但它仍然没有告诉您哪种组合格式作为FBO附件有效。 GL_FRAMEBUFFER_UNSUPPORTED
并非基于可单独呈现的每种格式,而是基于它们的组合。来自规范:
附加图像的内部格式组合不违反依赖于实现的限制。
如果您使用的附件不使用可渲染格式,那么您实际上会获得GL_FRAMEBUFFER_ATTACHMENT_INCOMPLETE
值。
要查找给定实现支持的格式组合,最好的办法是尝试一些可以支持您所需功能的组合。我会按优先顺序尝试它们,直到找到glCheckFramebufferStatus()
成功的组合。