1

使用 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 版本中获得此功能的相同功能?
  • 表示 GL_STENCIL_INDEX8 是唯一可模板渲染的格式,对吗?它无法在我的代码中运行。
  • 该文档显示了所有支持的格式枚举。内部格式和基本格式有什么区别。
4

1 回答 1

2

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

我不相信它会为您提供所需的一切。虽然它提供了关于每种格式的大量信息,看起来对目的有部分帮助,但它仍然没有告诉您哪些格式组合作为 FBO 附件是有效的。GL_FRAMEBUFFER_UNSUPPORTED不是基于单独可渲染的每种格式,而是基于它们的组合。从规范:

附加图像的内部格式的组合不违反与实现相关的一组限制。

如果您使用的附件不使用可渲染格式,您实际上会得到一个GL_FRAMEBUFFER_ATTACHMENT_INCOMPLETE值。

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

于 2015-06-09T03:35:33.810 回答