2

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

我真的想不出在默认帧缓冲区中有一个 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允许我检查我的愿望是否被授予的功能。

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

4

1 回答 1

2

我真的想不出在默认帧缓冲区中有一个 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);
于 2013-04-23T13:03:16.007 回答