【问题标题】:Can I have a default Framebuffer without alpha and depth?我可以有一个没有 alpha 和深度的默认帧缓冲区吗?
【发布时间】:2013-04-23 11:02:11
【问题描述】:

我希望通过不分配我不使用的内容来节省一些视频卡内存。我远没有耗尽内存,但对我来说它会感觉“更干净”。

我真的想不出在默认帧缓冲区中有 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 函数,该函数可以让我检查我的愿望是否得到满足。

正如我所说,没有紧急情况。我主要是好奇。

【问题讨论】:

    标签: opengl sdl opengl-3


    【解决方案1】:

    我真的想不出在默认帧缓冲区中有一个 alpha 值的理由,因为我的窗口无论如何都不会与我的桌面进行 alpha 混合。

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

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

    无论如何,用于创建 OpenGL 上下文的低级 WGL/GLX/etc API 确实允许您要求不具有 alpha 或深度。请注意,如果您要求 0 alpha 位,那几乎肯定会为您节省 0 内存,因为渲染到 32 位帧缓冲区比 24 位帧缓冲区更有效。所以还是留着吧。

    但是,由于您使用的是 SDL,以及 SDL 的 Go 绑定,这取决于 SDL,它是 Go 绑定。 sdl_gl_SetAttribute 函数应该可以工作,前提是 SDL 正确实现了它。如果您想验证这一点,您可以通过 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);
    

    【讨论】:

    • 事实上,在默认帧缓冲区上有一个 Alpha 通道将使 X11 中的窗口 Alpha 混合并运行合成器。请参阅位于 github.com/datenwolf/codesamples/tree/master/samples/OpenGL/… 的我的演示代码
    • 奇怪,glGetFramebufferAttachmentParameteriv 不断返回GL_INVALID_ENUM。如果我正确阅读了文档,则意味着目标“GL_DRAW_FRAMEBUFFER”是错误的。由于它可能没有错,我可能不正确地阅读文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多