Opengl 我可以有一个没有alpha和depth的默认帧缓冲区吗?

Opengl 我可以有一个没有alpha和depth的默认帧缓冲区吗?,opengl,sdl,opengl-3,Opengl,Sdl,Opengl 3,我希望通过不分配我不使用的东西来节省一些显卡内存。我远没有耗尽记忆,但对我来说,它会让我感觉“更干净” 我真的想不出在默认帧缓冲区中有alpha值的原因,因为我的窗口无论如何都不会与桌面alpha混合。我想知道我是否可以通过删除它的alpha来节省一些字节或者有更多的颜色深度 同样,我正在做一些延迟照明,所有深度计算都发生在不是默认帧缓冲区的帧缓冲区中。然后,我只需使用渲染场景时使用的纹理以及一些GUI元素将一个四元体(两个三元体)渲染到默认帧缓冲区,这些元素都不需要深度测试。渲染默认帧缓冲区时

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

我真的想不出在默认帧缓冲区中有alpha值的原因,因为我的窗口无论如何都不会与桌面alpha混合。我想知道我是否可以通过删除它的alpha来节省一些字节或者有更多的颜色深度

同样,我正在做一些延迟照明,所有深度计算都发生在不是默认帧缓冲区的帧缓冲区中。然后,我只需使用渲染场景时使用的纹理以及一些GUI元素将一个四元体(两个三元体)渲染到默认帧缓冲区,这些元素都不需要深度测试。渲染默认帧缓冲区时,我调用
glDisable(GL\u DEPTH\u TEST)
,但我不介意使用深度缓冲区而不是我不使用的深度缓冲区

我可以在OpenGl中实现吗?或者在SDL中创建OpenGl上下文

我尝试使用以下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\u gl\u GetAttribute
函数,该函数允许我检查我的愿望是否得到了满足

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

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

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

帧缓冲区alpha用于混合操作。有时,以某种方式基于目标alpha颜色进行混合非常有用。例如,我曾经在绘制反射曲面后绘制反射对象时,将目标alpha用作反射曲面的“反射率”值。必须按照该顺序进行,因为反射面必须在多次过程中绘制

在任何情况下,用于创建OpenGL上下文的低级WGL/GLX/ETCAPI都允许您要求不要使用alpha或depth。请注意,如果请求0个alpha位,几乎肯定会节省0个内存,因为渲染到32位帧缓冲区比渲染到24位帧缓冲区更有效。所以你还是留着吧

但是,由于您使用的是SDL和SDL的Go绑定,所以这取决于SDL和它的Go绑定。假设sdl正确实现,那么
sdl\u gl\u 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);

事实上,在默认帧缓冲区上有一个alpha通道将使X11中的窗口alpha混合运行合成器。请参阅我的演示代码,该代码位于http://code>glGetFramebufferAttachmentParameteriv不断返回
GL\u INVALID\u ENUM
。如果我正确地阅读了文档,这意味着目标“GL\u DRAW\u FRAMEBUFFER”是错误的。因为它可能没有错,我可能读错了文件。