opengl - 我可以有一个没有 Alpha 和深度的默认帧缓冲区吗?

标签 opengl sdl opengl-3

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

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

同样,我正在进行一些延迟照明,并且所有深度计算都发生在非默认帧缓冲区中。然后,我只需将一个四边形(两个三边形)渲染到默认帧缓冲区,其中包含渲染场景的纹理以及一些 GUI 元素,其中都不需要深度测试。我在渲染默认帧缓冲区时调用 glDisable(GL_DEPTH_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 的绑定(bind)缺少 sdl_gl_GetAttribute 函数,该函数允许我检查我的愿望是否得到满足。

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

最佳答案

I can't really think of a reason to have an alpha value in the default framebuffer since my window is not going to alpha-blend with my desktop anyway.

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

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

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

但是,由于您使用的是 SDL 以及 SDL 的 Go 绑定(bind),因此这取决于 SDL 和 Go 绑定(bind)。假设 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);

关于opengl - 我可以有一个没有 Alpha 和深度的默认帧缓冲区吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16167650/

相关文章:

c++ - 超出窗口的 opengl 菜单是如何实现的?

python - 嵌套循环显然不在 PyOpenGL 中循环

c - SDL指定窗口大小和位置

c++ - 无法获取索引缓冲区以在 OpenGL 中绘制正方形

c++ - 为每个物体绑定(bind)不同的纹理

c++ - 使用 true type 和 opengl core 的轮廓字体 (3.3)

opengl - 如何在 OpenGL 中绘制锯齿状像素化线

opengl - OSG 将场景渲染为图像

c - 可以用C/SDL写塔防吗

c - sdl中对象自动移动