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

Opengl 我是否正确使用了TexStorage,还是这是一个驱动程序错误?,opengl,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); 另一方面,如果我

我试图用这段代码将一个纹理压缩到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);
我的纹理似乎曝光过度,但如果我这样做:

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);
它看起来是正确的

作为记录,如果我使用这些函数的非直接\u state\u访问版本,glGetError和KHR\u debug报告没有错误,也没有任何更改。有人能告诉我,如果我使用这些功能不正确,或者这是一个驱动程序错误


编辑:好的,如果这还不够混乱的话。我决定使用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一样,图像看起来曝光过度,就像被当作线性数据处理一样。

为什么要使用…EXT函数?为什么不是glTexStorage2D和glTexSubImage2D这两个核心函数。@datenwolf你为什么问我这个问题?我已经说过我尝试了非DSA版本,效果也一样。为了回答您的问题,我使用DSA是因为我的目标是桌面计算机,这些计算机的图形卡都支持EXT_direct_state_access,这是一个非常有用的扩展。我只是想知道是否有特殊的原因。因为它是一个EXT扩展,所以不需要OpenGL扩展来实际实现它。不过,在core中使用DSA会很好。我认为这不是您的问题(您可能没有使用mipmap
纹理\u MIN\u过滤器),但您正在为10个mipmap级别分配存储,但只上载基本级别的数据。无论如何,我没有使用压缩格式或sRGB内部格式的
TextureStoreRage
,但似乎您使用得很正确,似乎对我来说这可能是一个驱动程序错误;就像只是逐字插入使用
SubImage
上传的数据一样,忽略格式转换?如果使用
glTexImage2D
null
数据指针而不是
glTexStorage2D
,那么
glTexSubImage2D
是否仍然给出不正确的结果?