Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 上载压缩纹理时,GL_操作无效_C++_Qt_Opengl_Texture2d - Fatal编程技术网

C++ 上载压缩纹理时,GL_操作无效

C++ 上载压缩纹理时,GL_操作无效,c++,qt,opengl,texture2d,C++,Qt,Opengl,Texture2d,每次我尝试使用QtQOpenGLTexture上传带有多个mipmap级别的DXT1纹理时,我都会得到一个GL\u INVALID\u操作。对于mipmap级别0,一切正常,但对于任何其他类型,我在Qt库中的glCompressedTexSubImage2DEXT()处执行GL\u无效\u操作。我的错在哪里 代码: 以下是glIntercept日志的一部分: glGenTextures(1,00000000006DCE68) glTextureParameteriEXT(1,GL_TEXTURE

每次我尝试使用Qt
QOpenGLTexture
上传带有多个mipmap级别的
DXT1
纹理时,我都会得到一个
GL\u INVALID\u操作。对于mipmap级别0,一切正常,但对于任何其他类型,我在Qt库中的
glCompressedTexSubImage2DEXT()
处执行
GL\u无效\u操作。我的错在哪里

代码:

以下是glIntercept日志的一部分:

glGenTextures(1,00000000006DCE68)
glTextureParameteriEXT(1,GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0)
glTextureParameteriEXT(1,GL_TEXTURE_2D,GL_TEXTURE_MAX_LEVEL,11)
glTextureStorage2DEXT(1,GL_TEXTURE_2D,1,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,2048,2048)
glBindTexture(GL_TEXTURE_2D,1)
glCompressedTextureSubImage2DEXT(1,GL_TEXTURE_2D,0,0,0,2048,2048,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,2097152,00000000147A0080)
glGetError()=GL_NO_ERROR 
glCompressedTextureSubImage2DEXT(1,GL_TEXTURE_2D,1,0,0,1024,1024,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,524288,00000000149A0080) glGetError() = GL_INVALID_OPERATION
glGetError()=GL_INVALID_OPERATION 
glCompressedTextureSubImage2DEXT(1,GL_TEXTURE_2D,2,0,0,512,512,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,131072,0000000014A20080) glGetError() = GL_INVALID_OPERATION
glGetError()=GL_INVALID_OPERATION 
glCompressedTextureSubImage2DEXT(1,GL_TEXTURE_2D,3,0,0,256,256,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,32768,0000000014A40080) glGetError() = GL_INVALID_OPERATION
glGetError()=GL_INVALID_OPERATION 
glCompressedTextureSubImage2DEXT(1,GL_TEXTURE_2D,4,0,0,128,128,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,8192,0000000014A48080) glGetError() = GL_INVALID_OPERATION
glGetError()=GL_INVALID_OPERATION 
glCompressedTextureSubImage2DEXT(1,GL_TEXTURE_2D,5,0,0,64,64,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,2048,0000000014A4A080) glGetError() = GL_INVALID_OPERATION
glGetError()=GL_INVALID_OPERATION 
glCompressedTextureSubImage2DEXT(1,GL_TEXTURE_2D,6,0,0,32,32,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,512,0000000014A4A880) glGetError() = GL_INVALID_OPERATION
glGetError()=GL_INVALID_OPERATION 
glCompressedTextureSubImage2DEXT(1,GL_TEXTURE_2D,7,0,0,16,16,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,128,0000000014A4AA80) glGetError() = GL_INVALID_OPERATION
glGetError()=GL_INVALID_OPERATION 
glCompressedTextureSubImage2DEXT(1,GL_TEXTURE_2D,8,0,0,8,8,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,32,0000000014A4AB00) glGetError() = GL_INVALID_OPERATION
glGetError()=GL_INVALID_OPERATION 
glCompressedTextureSubImage2DEXT(1,GL_TEXTURE_2D,9,0,0,4,4,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,8,0000000014A4AB20) glGetError() = GL_INVALID_OPERATION
glGetError()=GL_INVALID_OPERATION 
glCompressedTextureSubImage2DEXT(1,GL_TEXTURE_2D,10,0,0,2,2,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,8,0000000014A4AB28) glGetError() = GL_INVALID_OPERATION
glGetError()=GL_INVALID_OPERATION 
glCompressedTextureSubImage2DEXT(1,GL_TEXTURE_2D,11,0,0,1,1,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,8,0000000014A4AB30) glGetError() = GL_INVALID_OPERATION
glGetError()=GL_INVALID_OPERATION 
glTextureParameteriEXT(1,GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,9729)
glTextureParameteriEXT(1,GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,9729)

调用
glTextureStrage2dext
时,您仅为单个mipmap分配了足够的内存。第三个参数是要分配的mipmap级别数-在您的情况下,应该是11:

glTextureStorage2DEXT(1,GL_TEXTURE_2D,11,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,2048,2048)
对于给定的宽度和高度,您可以使用
floor(log2(max(width,height))+1计算生成完整mipmap链所需的层数


对不起,我没有完全回答这个问题!您不应该调用
setMipLevelRange
,而应该调用。如
setMipLevels
的Qt文档中所述:

对于支持mipmap的纹理目标,此函数设置要为其分配存储的请求mipmap级别数。在为纹理分配存储之前,应调用此函数

这应该起作用:

mTexture.setMipLevels(floor(log2(max(width, height))) + 1);
或者使用
解析器.getMipmapCount()
方法:

mTexture.setMipLevels(parser.getMipmapCount());

调用
glTextureStrage2dext
时,您仅为单个mipmap分配了足够的内存。第三个参数是要分配的mipmap级别数-在您的情况下,应该是11:

glTextureStorage2DEXT(1,GL_TEXTURE_2D,11,GL_COMPRESSED_RGB_S3TC_DXT1_EXT,2048,2048)
对于给定的宽度和高度,您可以使用
floor(log2(max(width,height))+1计算生成完整mipmap链所需的层数


对不起,我没有完全回答这个问题!您不应该调用
setMipLevelRange
,而应该调用。如
setMipLevels
的Qt文档中所述:

对于支持mipmap的纹理目标,此函数设置要为其分配存储的请求mipmap级别数。在为纹理分配存储之前,应调用此函数

这应该起作用:

mTexture.setMipLevels(floor(log2(max(width, height))) + 1);
或者使用
解析器.getMipmapCount()
方法:

mTexture.setMipLevels(parser.getMipmapCount());

通过查看Qt文档,我认为您可能需要调用
setMipLevels()
,而不是
setMipLevelRange()
。前者指定要分配多少级别,而后者指定采样范围。通过查看Qt文档,我认为您可能需要调用
setMipLevels()
,而不是
setMipLevelRange()
。前者指定要分配的级别数,而后者指定采样范围。