gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:37 28 4
gpt4 key购买 nike

在过去使用常规 OpenGL 的好日子里,确定纹理上传是否成功相当容易 - 在调用 glTexImage2D 之后,您可以使用带有 GL_TEXTURE_WIDTH 和 GL_TEXTURE_HEIGHT 作为参数的 glGetTexLevelParameteriv。然而,GLES 似乎不允许这样做,据我所知,它没有机制来确定纹理是否实际上已成功提供给卡(例如,glGetError 仅针对 将不成功,而不是没有成功的事情。

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

最佳答案

我担心目前这是不可能的。现在删除了包含纹理大小的整个 OpenGL 状态(根据 GLES 2.0.25 规范)。正如您正确指出的那样,纹理上传出错时不会生成错误(遗憾的是设计使然)。代理纹理已被删除,据人们报告,它们在 PC 级 GPU 上通常不受支持/损坏。那么现在呢?

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

您可以(理论上)通过创建渲染缓冲区对象来确定可用内存量,规范指出 glRenderbufferStorage() 将因 GL_OUT_OF_MEMORY 而失败,因此这应该是相当可靠的。

在分配纹理之前测试可用空间非常容易,然后删除渲染缓冲区(如果成功)然后分配纹理本身。请记住,使用 mipmap 时,纹理将占用基本级别的 1.33 倍多一点的存储空间。

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

关于android - 如何确定在 OpenGL ES 2 中纹理上传是否成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5824378/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com