The specification glTexImage2D()给出了一个接受internalFormat
参数的大表。我想知道,如果真的重要的是我将此参数设置为,因为文档说
如果应用程序想要将纹理存储在某个特定的位置 分辨率或某种格式,它可以请求解决 并使用internalFormat格式化。 GL将选择内部 表示非常接近internalFormat所要求的表示,但是 它可能不完全匹配。
这使得看起来好像OpenGL只会选择它想要的东西。我是否应该费心获取图像位深度并将internalFormat
设置为GL_RGBA8
或GL_RGBA16
?我见过的所有代码示例都使用GL_RGBA
...
答案 0 :(得分:2)
这使得看起来好像OpenGL只会选择它想要的东西。
这是非常误导的。
有许多格式的实现都是required to support more or less exactly as described。确实允许实现将它们存储在更大的存储中。但与他们相比,他们不允许失去精确度。使用它们是有好处的(除了明确知道你正在得到什么)。
首先,它允许您像GL_RGB10_A2一样使用specialized formats,这在某些情况下很方便(存储延迟渲染的线性颜色值等)。其次,FBO 必需支持任何图像格式组合,但仅如果所有这些图像格式都来自required color formats for textures/renderbuffers (but not the texture-only).列表如果您正在使用任何其他内部格式,FBO可以向您发送GL_FRAMEBUFFER_UNSUPPORTED
。
第三,immutable texture storage functions 要求使用大小的内部格式。你应该在它们可用的时候使用它们。
通常,您应该始终使用大小的内部格式。没有理由使用通用的那些。
答案 1 :(得分:0)
使用通用的内部格式OpenGL会选择最喜欢的东西,并告诉它你不在乎。使用明确的内部格式,您告诉OpenGL,您实际上关心内部表示(很可能是因为您需要精度)。如果无法完全匹配,则实现可以自由升级或降级,而通常的后备是升级到可以满足请求的下一个更高格式的精度。
我是否应该费心获取图像位深度并设置internalFormat
如果你绝对需要精确度,那么是的。如果您的关注点更多地是关于性能,那么,如果没有请求特定格式,则不会像OpenGL实现的常见默认值那样选择内部格式以获得最佳性能。