基本内部格式如何运作?

时间:2017-07-02 17:59:25

标签: opengl textures

glTexImage2D函数接受所谓的"基本内部格式"列出如下:

GL_DEPTH_COMPONENT
GL_DEPTH_STENCIL
GL_RED
GL_RG
GL_RGB
GL_RGB

这些似乎缺少任何类型或尺寸信息。引用文档:

  

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

glTexStorage2D的文档中未列出这些格式,我找不到更准确的格式。我显然是通过愚蠢的运气使GL_RGBA工作,但我想更好地理解我在这里所做的事情。

使用基本内部格式时会发生什么? 如何选择存储的类型,大小和布局?
我之后是否希望查询所选格式并调整我的程序的其余部分,例如GLSL采样器类型?

1 个答案:

答案 0 :(得分:2)

glTexStorage*不允许"基本内部格式"是因为你不应该使用它们。它仅支持具有良好定义行为的内部格式。

  

使用基本内部格式时会发生什么?

在下面列出的限制范围内,您可以获得驱动程序想要提供的任何图像格式。

  

如何选择存储的类型,大小和布局?

"类型"对于这样的纹理,将始终是无符号的标准化整数。它将至少具有基本内部格式的通道。

其他一切完全取决于司机。如果驱动程序想要添加多于您指定的通道,则可以执行此操作。如果驱动程序想要为每个通道提供16位格式,则可以这样做。

  

我是否希望事后查询所选格式并调整我的程序的其余部分,例如GLSL采样器类型?

无需查询,因为它们始终是未签名的标准化图像。因此,您在着色器中使用sampler*,而不是usampler*isampler*