WebGL中最大纹理数量

3
我一直在寻找有关WebGL和可用于渲染的纹理数量/内存量的相关信息。这显然取决于硬件/设备,因此我正在寻找一种智能处理纹理的方法。
目前,我的纹理是512x512 RGBA8格式的。潜在地,用户可以加载270个纹理到内存中。我了解到每个像素计算4个字节,乘以4/3来计算mip贴图。因此,单个纹理加上mip贴图的总大小约为4 * 512 * 512 * 1.33 = 1.33MB。这将导致总共需要将359.1MB的纹理加载到内存中。
这是最坏情况,并且对中高端机器而言没有问题,但是我也希望在WebGL广泛可用于Android和低端机器后进行优化。
如果我将纹理缩小为256x256,我会注意到质量损失,但这可能是低端设备的选择。这将导致每个纹理的总大小为4 * 256 * 256 * 1.33 = 0.33MB,总计89.1MB。
是否有API可以在尝试将纹理加载到WebGL上下文之前确定可用的纹理内存总量?
另外,同时加载到内存中的纹理总数是否也有限制?
我想利用以上两个参数来在用户加载我的页面时设置合理的默认值。

这个回答解决了你的问题吗?WebGL中纹理的最大数量是多少? - undefined
2个回答

1
据我所知,目前没有办法做到这一点。根据Toji的答案,这似乎是出于安全原因。
我建议考虑将纹理缩小以适应所有用户,而不仅仅是拥有强大的独立显卡的桌面用户。也许你可以将更高级别的图形作为一个选项,但要意识到这可能会导致一些/大多数人出现内存溢出异常。
如果你偶尔没有使用所有这些纹理,你可以尝试跟踪你正在使用哪些纹理,并仅将其加载到内存中(并使用gl.deleteTextures卸载纹理)。我猜想在运行时删除和加载这么多的纹理而不是在启动时加载会花费很多时间,因此要谨慎地进行操作(每次只处理几个),以保持帧率。不确定你是否能够在一帧中加载1.33MB的纹理,或者这是否适用于你的应用程序。

1
谢谢,虽然这不是我想听到的,但却是我担心的。所涉及的应用程序是一款游戏,因此用户期望获得丰富的体验。我将不得不构建一些系统,以便在首次访问时提示用户选择高或低分辨率版本,并指出为什么要选择其中之一。再次感谢。 - fungus1487
即使在桌面OpenGL或DirectX上也无法做到这一点。OpenGL有一些供应商特定的扩展,但它们被认为是虚假的。DirectX也有一些,但也被认为是虚假的。 - gman

0

我相信这个问题在WebGL中的纹理最大数量?中已经得到了完全的回答。

要了解纹理限制,您可以查阅WebGL1或2的保证最低限制。在这种情况下,MAX_TEXTURE_IMAGE_UNITS是片段着色器能够绑定的保证最低限制(WebGL 2的16个纹理)。

官方限制可以在规范中查阅。WebGL2遵循GLES3规范: https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glGet.xhtml https://registry.khronos.org/OpenGL/specs/es/3.0/es_spec_3.0.pdf#page=286

在实践中,实现可能支持更多

该应用程序可以根据保证值或实际最小值选择一个限制,也可以在运行时动态查询和绑定资源。

const maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接