我可以使用没有alpha和深度的默认Framebuffer吗?

时间:2013-04-23 11:02:11

标签: opengl sdl opengl-3

我希望通过不分配我不使用的内容来节省一些显卡内存。我远没有记忆力不足,但对我来说会感觉“更清洁”。

我无法想到在默认的帧缓冲区中有一个alpha值的原因,因为我的窗口不会与我的桌面进行alpha混合。我想知道我是否可以通过删除其alpha来保存几个字节或更多颜色深度。

同样,我正在做一些延迟光照,我所有的深度计算都发生在一个非默认的帧缓冲区中。然后我简单地将四边形(两个tris)渲染到默认的帧缓冲区,其中我渲染场景的纹理以及一些GUI元素,其中没有一个需要深度测试。我在渲染默认帧缓冲区时调用glDisable(GL_DEPTH_TEST),但我不介意根本没有深度缓冲区而不是我不使用的深度缓冲区。

我可以在OpenGl中做到吗?或者在我创建OpenGl上下文的SDL中?

我尝试使用以下SDL属性创建我的OpenGl上下文

sdl.GL_SetAttribute(sdl.GL_DOUBLEBUFFER, 1)
sdl.GL_SetAttribute(sdl.GL_DEPTH_SIZE, 0)
sdl.GL_SetAttribute(sdl.GL_ALPHA_SIZE, 0)
info := sdl.GetVideoInfo()
bpp := int(info.Vfmt.BitsPerPixel)
if screen := sdl.SetVideoMode(640, 480, bpp, sdl.OPENGL); screen == nil {
    panic("Could not open SDL window: " + sdl.GetError())
}
if err := gl.Init(); err != nil {
    panic(err)
}

不幸的是,SDL对GoLang的绑定缺少sdl_gl_GetAttribute功能,可以让我检查我的意愿是否被授予。

正如我所说,没有紧急情况。我很好奇。

1 个答案:

答案 0 :(得分:1)

  

我无法想到在默认的帧缓冲区中有一个alpha值的原因,因为我的窗口不会与我的桌面进行alpha混合。

这很好,因为具有alpha通道的默认帧缓冲区实际上不会这样做(无论如何都在Windows上)。

帧缓冲区alpha用于混合操作。基于目标alpha颜色以某种方式进行混合有时很有用。例如,在绘制反射表面后绘制反射对象时,我曾使用目标alpha作为反射表面的“反射率”值。有必要按此顺序进行,因为反射表面必须多次绘制。

在任何情况下,用于创建OpenGL上下文的低级WGL / GLX / etc API都允许您要求不具有alpha或深度。请注意,如果要求0位字符,那几乎可以节省0个内存,因为渲染到32位帧缓冲区比24位帧缓冲区更有效。所以你也可以保留它。

但是,由于你正在使用SDL和SDL的Go绑定,这取决于SDL和它的Go绑定。假设SDL正确实现,sdl_gl_SetAttribute函数应该有效。如果你想验证这一点,你可以通过OpenGL询问帧缓冲:

glBindFramebuffer(GL_FRAMEBUFFER, 0); //Use the default framebuffer.
GLint depthBits, alphaBits;
glGetFramebufferAttachmentParameteriv(GL_DRAW_FRAMEBUFFER, GL_DEPTH, GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE, &depthBits);
glGetFramebufferAttachmentParameteriv(GL_DRAW_FRAMEBUFFER, GL_BACK_LEFT, GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE, &alphaBits);