我正确使用TexStorage还是这是一个驱动程序错误?

时间:2013-12-12 00:45:39

标签: opengl

我正在尝试使用此代码将纹理压缩为BPTC,但我的图像已损坏。

glTextureStorage2DEXT(texture, GL_TEXTURE_2D, 10, GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM, 512, 512);
glTextureSubImage2DEXT(texture, GL_TEXTURE_2D, 0, 0, 0, 512, 512, GL_RGBA, GL_UNSIGNED_BYTE, image_buffer);

另一方面,如果我使用它,它可以工作。

glTextureImage2DEXT(texture, GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_buffer);

另外,如果我这样做:

glTextureStorage2DEXT(texture, GL_TEXTURE_2D, 10, GL_SRGB8_ALPHA8, 512, 512);
glTextureSubImage2DEXT(texture, GL_TEXTURE_2D, 0, 0, 0, 512, 512, GL_RGBA, GL_UNSIGNED_BYTE, image_buffer);

我的纹理显得过度曝光,但如果我这样做:

glTextureImage2DEXT(texture, GL_TEXTURE_2D, 0, GL_SRGB8_ALPHA8, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_buffer);

看起来是正确的。

对于记录,glGetError和KHR_debug报告没有错误,如果我使用这些函数的非direct_state_access版本,则没有任何变化。有人可以告诉我,如果我错误地使用这些功能,或者这是一个驱动程序错误。

编辑:好的,所以如果这还不够混淆。我决定使用glGetTexLevelParameteriv在创建后实际检查纹理的内部格式。当我使用glTexImage2D和GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM创建纹理时,glGetTexLevelParameteriv返回格式为GL_SRGB_ALPHA。如果我使用glTexStorage2D和GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM创建纹理,glGetTexLevelParameteriv将以格式GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM返回,但当然如果我在其上使用glTexSubImage2D,它最终会损坏(彩色噪声)。我试过GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT。 glTexImage2D似乎工作正常。它说纹理实际上是S3TC。 glTexStorage2D也能够处理它,而不会破坏图像,但与GL_SRGB8_ALPHA8一样,图像看起来过度曝光,就好像它被视为线性数据一样。

0 个答案:

没有答案