2014-09-06 56 views
0

在Windows 7上(使用nVidia GTS 450),我的帧缓存似乎被锁定为有0个alpha位。这意味着当我呼叫glCopyTexSubImage2D渲染到纹理时,纹理将始终是不透明的。我需要我FBO中的RenderBufferObject渲染到alpha通道保持纹理吗?

我正在编写我的OpenGL代码的替代版本,它将使用FBO渲染到纹理(而不是glCopyTexSubImage2D),希望能够解决alpha丢弃的问题。

如果我使用FBO,是否还需要分配我自己的帧缓冲区(RenderBufferObject)?我对FBO的知识有点缺乏,但我的理解是,如果我不提供渲染缓冲存储器,并且只是附加纹理,它将使用现有的帧缓冲区(没有alpha位),因此我的纹理将仍然是完全不透明的。

编辑:一些天翻地覆与我的项目设置在0我的alpha位是被锁定的,我现在已经成功地获得阿尔法的8位,glCopyTexSubImage2D

回答

0

纹理和renderbuffers主要服务于同一目的的原因作为FBO附件。您可以使用纹理或渲染缓冲区作为您的颜色附件,纹理或渲染缓冲区作为深度附件等。

主要区别在于,在完成对FBO的渲染后,如果您使用纹理作为附件,可以像任何其他纹理一样使用它们进行采样。如果您使用渲染缓冲区,则该选项不可用。渲染缓冲区不能用于除FBO目标外的其他任何事情。之后你可以用它做的唯一事情就是使用glBlitFramebuffer()将它复制到另一个渲染目标。

因此,渲染缓冲区对于在完成FBO渲染后不再使用的缓冲区而言非常有用。对于深度缓冲区来说,情况通常如此。对于大多数有趣的3D渲染,您将需要FBO渲染的深度缓冲区。但在很多情况下,渲染完成后,您只需放弃深度缓冲区的内容。

你可能会问为什么你会使用渲染缓冲区,如果你可以用纹理附件等做同样的事情。可以有几个优点:

  • 在某些OpenGL版本中,渲染缓冲区可以做的比纹理附件更多。例如,ES 3.0支持多重采样的渲染缓冲区,但不支持多重采样的纹理。
  • 某些硬件架构具有多个内存布局,其中一个对渲染目标可能更高效,另一个对采样更有效。如果你分配一个渲染缓冲区,驱动程序知道它只会被用作渲染目标,并且可能会使用更高效的内存布局。
  • 用于创建渲染缓冲区的API更简单。

这涵盖了一般背景。你的具体情况如下:

  • 不,如果你渲染到一个纹理(即使用纹理作为你的FBO的颜色附件),你也不需要渲染缓冲区来达到同样的目的。
  • 您可能需要创建一个渲染缓冲区,以用作FBO渲染的深度缓冲区。为此,您创建一个带有glRenderbufferStorage()的渲染缓冲区,并使用glFramebufferRenderbuffer()将其作为FBO的GL_DEPTH_ATTACHMENT进行附加。请注意,默认帧缓冲区的深度缓冲区是用于FBO渲染的而不是,所以如果您需要FBO渲染的深度缓冲区,则需要此深度缓冲区。

顺便说一句,你的视频卡应该肯定支持framebuffer中的阿尔法位。在Windows下,您可以通过在PIXELFORMATDESCRIPTOR结构中设置cAlphaBits字段来请求字母位。如果您想在帧缓冲区中使用字节位,则此字段的典型值为8。

+0

[cAlphaBits在Windows上被忽略](http://msdn.microsoft.com/en-us/library/windows/desktop/dd368826%28v=vs.85%29.aspx)。即使设置了(到8),“glGetIntegerv”也会告诉我,我的帧缓冲区仍然没有字母位。质地仍然不透明。 – 2014-09-06 07:12:06

+0

@ Mr.Smith:这是不正确的:“如上文所述,请仔细注意当前通用实现中不支持某些像素格式属性,通用实现是OpenGL的Microsoft GDI软件实现。部分是OpenGL的,并且可能支持一些不受通用实现支持的像素格式属性。“每个实现都包含微软的GDI渲染器,它支持从Windows开始的alpha通道。 – derhass 2014-09-06 12:21:18

+1

我很确定我至少在Windows XP和NV34 GPU上使用了带有alpha位的帧缓冲区。我刚刚证实,他们仍然支持我当前运行Windows 8.1的笔记本电脑。在我测试的配置(英特尔高清4600显卡)中,我得到了一个像素格式,其中cAlphaBits = 8时甚至不需要alpha位。 – 2014-09-06 17:52:24