正确使用OpenGL方法glTexImage2D()?

时间:2013-03-05 02:10:50

标签: opengl specifications

对于OpenGL方法,

The specification glTexImage2D()给出了一个接受internalFormat参数的大表。我想知道,如果真的重要的是我将此参数设置为,因为文档说

  

如果应用程序想要将纹理存储在某个特定的位置               分辨率或某种格式,它可以请求解决               并使用internalFormat格式化。 GL将选择内部               表示非常接近internalFormat所要求的表示,但是               它可能不完全匹配。

这使得看起来好像OpenGL只会选择它想要的东西。我是否应该费心获取图像位深度并将internalFormat设置为GL_RGBA8GL_RGBA16?我见过的所有代码示例都使用GL_RGBA ...

2 个答案:

答案 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实现的常见默认值那样选择内部格式以获得最佳性能。