Android 如何确定纹理上传是否在OpenGL ES 2中成功?
在传统OpenGL的好日子里,确定纹理上传是否成功相当容易——调用glTexImage2D后,您可以使用glGetTexLevelParameteriv和GL_texture_WIDTH和GL_texture_HEIGHT作为参数。然而,GLES似乎不允许这样做,而且据我所知,它没有任何机制来确定纹理是否已成功提供给卡(例如,glGetError仅针对不会成功的事情设置,而不是针对未成功的事情设置)Android 如何确定纹理上传是否在OpenGL ES 2中成功?,android,opengl-es-2.0,powervr-sgx,Android,Opengl Es 2.0,Powervr Sgx,在传统OpenGL的好日子里,确定纹理上传是否成功相当容易——调用glTexImage2D后,您可以使用glGetTexLevelParameteriv和GL_texture_WIDTH和GL_texture_HEIGHT作为参数。然而,GLES似乎不允许这样做,而且据我所知,它没有任何机制来确定纹理是否已成功提供给卡(例如,glGetError仅针对不会成功的事情设置,而不是针对未成功的事情设置) 我正在开发的应用程序总是跨越有足够的可用VRAM和没有可用VRAM之间的障碍(通常会有很多动态分
我正在开发的应用程序总是跨越有足够的可用VRAM和没有可用VRAM之间的障碍(通常会有很多动态分配的FBO之类的东西四处飞来飞去,使事情更加复杂),如果一个重要的纹理上传失败,我需要知道是否需要清除一个不重要的纹理,然后重试。我担心目前不可能做到这一点。包含纹理大小的整个OpenGL状态现在被删除(根据GLES 2.0.25规范)。正如您正确指出的,纹理上传不会出错(这是设计造成的遗憾)。代理纹理被删除,据人们报告,PC级GPU上通常不支持/破坏代理纹理。那现在呢 您可以尝试通过帧缓冲区对象读取纹理内容(可能不是整个纹理,但只有角点/每32个像素/…)。这不会很快,但它应该会起作用。也许您还可以使用附加纹理的帧缓冲区完整性测试(但这似乎仅限于图像内部格式,如果纹理上载因内存不足而失败,则可以设置或不设置该格式-您必须进行测试) 您可以(理论上)通过创建一个renderbuffer对象来确定可用内存量,该规范声明glRenderbufferStorage()将在GL_内存不足时失败,因此这应该是非常可靠的 在分配纹理、删除renderbuffer(如果成功)然后分配纹理本身之前,测试可用空间非常容易。请记住,使用mipmaps时,纹理占用的基本级别存储空间将略多于1.33倍
更好的方法是在应用程序启动时确定可用内存(可能是在编译着色器和分配其他不容易估计内存占用的对象之后),并跟踪对象分配以查看剩余内存量。这看起来很复杂,但是如果OpenGL对象被包装在类中,这应该很容易。
更好的方法是确定可用内存并跟踪对象分配,以查看剩余内存量。
由于内存碎片,这将是不可靠的。