1

OpenGL 方法 glTexImage2D()的规范给出了一个接受internalFormat参数的大表。我想知道,如果我设置这个参数真的很重要,因为文档说

如果应用程序想要以某种分辨率或某种格式存储纹理,它可以使用 internalFormat 请求分辨率和格式。GL 将选择一个与 internalFormat 要求的内部表示非常接近的内部表示,但它可能不完全匹配。

这使得 OpenGL 似乎无论如何都会选择它想要的东西。我是否应该费心获取图像位深度并将其设置internalFormatGL_RGBA8GL_RGBA16?我见过的所有代码示例都只是使用GL_RGBA...

4

2 回答 2

2

这使得 OpenGL 似乎无论如何都会选择它想要的东西。

这是非常具有误导性的。

有许多格式需要实现或多或少地完全按照所描述的那样支持。确实允许实现将它们存储在更大的存储空间中。但是与它们相比,它们不允许失去精度。使用它们有很多好处(除了清楚地知道你得到了什么)。

首先,它允许您使用专门的格式,例如 GL_RGB10_A2,这在某些情况下很方便(为延迟渲染存储线性颜色值等)。其次,FBO需要支持图像格式的任意组合,但前提是所有这些图像格式都来自纹理/渲染缓冲区所需的颜色格式列表(但不是仅纹理)。如果您使用任何其他内部格式,FBO 可能会向GL_FRAMEBUFFER_UNSUPPORTED您扔东西。

第三,不可变纹理存储功能 需要使用大小合适的内部格式。你应该在它们可用时使用它们。

通常,您应该始终使用调整大小的内部格式。没有理由使用通用的。

于 2013-03-05T03:18:51.323 回答
0

使用通用的内部格式,OpenGL 会选择它“最喜欢”的任何东西,并告诉它你不在乎。使用明确的内部格式,您是在告诉 OpenGL,您实际上关心内部表示(很可能是因为您需要精度)。如果无法进行精确匹配,则可以自由升级或降级实现,但通常的后备是升级到可以满足请求要求的下一个更高的格式精度。

我是否应该费心获取图像位深度并设置 internalFormat

如果您绝对需要精度,那么可以。如果您更关心性能,那么不,作为 OpenGL 实现的通常默认设置,如果没有请求特定格式,则选择内部格式以获得最佳性能。

于 2013-03-05T02:57:08.480 回答