如何获得当前实现支持的正确颜色和/或模板可渲染内部格式?

时间:2015-06-08 03:31:18

标签: opengl off-screen

使用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版本和硬件实现中使我的代码可移植?

我的研究:

  • glGetInternalformat()仅在OpenGL 4.1或更高版本中受支持。如果我可以在较旧的OpenGL版本中获得此功能的相同功能?
  • This说GL_STENCIL_INDEX8是唯一的模板可渲染格式,这是正确的吗?它无法在我的代码中运行。
  • This doc显示所有支持的格式枚举。内部格式和基本格式之间有什么区别。

1 个答案:

答案 0 :(得分:2)

glGetInternalFormat()是OpenGL 4.2中的新功能。在早期版本中无法获得相同的信息。

我不相信它会给你所有你需要的东西。虽然它提供了大量有关每种格式的信息,但看起来部分有助于此目的,但它仍然没有告诉您哪种组合格式作为FBO附件有效。 GL_FRAMEBUFFER_UNSUPPORTED并非基于可单独呈现的每种格式,而是基于它们的组合。来自规范:

  

附加图像的内部格式组合不违反依赖于实现的限制。

如果您使用的附件不使用可渲染格式,那么您实际上会获得GL_FRAMEBUFFER_ATTACHMENT_INCOMPLETE值。

要查找给定实现支持的格式组合,最好的办法是尝试一些可以支持您所需功能的组合。我会按优先顺序尝试它们,直到找到glCheckFramebufferStatus()成功的组合。