glTexImage2D
函数接受所谓的"基本内部格式"列出如下:
GL_DEPTH_COMPONENT
GL_DEPTH_STENCIL
GL_RED
GL_RG
GL_RGB
GL_RGB
这些似乎缺少任何类型或尺寸信息。引用文档:
如果应用程序想要以特定分辨率或某种格式存储纹理,它可以使用internalFormat请求分辨率和格式。 GL将选择一个与internalFormat所要求的内部表示非常接近的内部表示,但它可能不完全匹配。 (
GL_RED
,GL_RG
,GL_RGB
和GL_RGBA
指定的陈述必须完全匹配。)
glTexStorage2D
的文档中未列出这些格式,我找不到更准确的格式。我显然是通过愚蠢的运气使GL_RGBA
工作,但我想更好地理解我在这里所做的事情。
使用基本内部格式时会发生什么?
如何选择存储的类型,大小和布局?
我之后是否希望查询所选格式并调整我的程序的其余部分,例如GLSL采样器类型?
答案 0 :(得分:2)
glTexStorage*
不允许"基本内部格式"是因为你不应该使用它们。它仅支持具有良好定义行为的内部格式。
使用基本内部格式时会发生什么?
在下面列出的限制范围内,您可以获得驱动程序想要提供的任何图像格式。
如何选择存储的类型,大小和布局?
"类型"对于这样的纹理,将始终是无符号的标准化整数。它将至少具有基本内部格式的通道。
其他一切完全取决于司机。如果驱动程序想要添加多于您指定的通道,则可以执行此操作。如果驱动程序想要为每个通道提供16位格式,则可以这样做。
我是否希望事后查询所选格式并调整我的程序的其余部分,例如GLSL采样器类型?
无需查询,因为它们始终是未签名的标准化图像。因此,您在着色器中使用sampler*
,而不是usampler*
或isampler*
。