Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.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
Android 如何确定纹理上传是否在OpenGL ES 2中成功?_Android_Opengl Es 2.0_Powervr Sgx - Fatal编程技术网

Android 如何确定纹理上传是否在OpenGL ES 2中成功?

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之间的障碍(通常会有很多动态分

在传统OpenGL的好日子里,确定纹理上传是否成功相当容易——调用glTexImage2D后,您可以使用glGetTexLevelParameteriv和GL_texture_WIDTH和GL_texture_HEIGHT作为参数。然而,GLES似乎不允许这样做,而且据我所知,它没有任何机制来确定纹理是否已成功提供给卡(例如,glGetError仅针对不会成功的事情设置,而不是针对未成功的事情设置)


我正在开发的应用程序总是跨越有足够的可用VRAM和没有可用VRAM之间的障碍(通常会有很多动态分配的FBO之类的东西四处飞来飞去,使事情更加复杂),如果一个重要的纹理上传失败,我需要知道是否需要清除一个不重要的纹理,然后重试。

我担心目前不可能做到这一点。包含纹理大小的整个OpenGL状态现在被删除(根据GLES 2.0.25规范)。正如您正确指出的,纹理上传不会出错(这是设计造成的遗憾)。代理纹理被删除,据人们报告,PC级GPU上通常不支持/破坏代理纹理。那现在呢

您可以尝试通过帧缓冲区对象读取纹理内容(可能不是整个纹理,但只有角点/每32个像素/…)。这不会很快,但它应该会起作用。也许您还可以使用附加纹理的帧缓冲区完整性测试(但这似乎仅限于图像内部格式,如果纹理上载因内存不足而失败,则可以设置或不设置该格式-您必须进行测试)

您可以(理论上)通过创建一个renderbuffer对象来确定可用内存量,该规范声明glRenderbufferStorage()将在GL_内存不足时失败,因此这应该是非常可靠的

在分配纹理、删除renderbuffer(如果成功)然后分配纹理本身之前,测试可用空间非常容易。请记住,使用mipmaps时,纹理占用的基本级别存储空间将略多于1.33倍


更好的方法是在应用程序启动时确定可用内存(可能是在编译着色器和分配其他不容易估计内存占用的对象之后),并跟踪对象分配以查看剩余内存量。这看起来很复杂,但是如果OpenGL对象被包装在类中,这应该很容易。

更好的方法是确定可用内存并跟踪对象分配,以查看剩余内存量。
由于内存碎片,这将是不可靠的。