WebGL 最大纹理数

问题描述 投票:0回答:2

我一直在寻找有关 WebGL 以及可分配用于渲染的最大纹理数量/内存量的信息。这显然是特定于硬件/设备的,因此我正在寻找一种智能处理纹理的方法。

我目前有 512x512 RGBA8 格式的纹理。用户可能可以将 270 个纹理加载到内存中。据我了解,对于 mip 贴图,其计算结果为每像素 4 字节乘以 4/3。因此,单个纹理加上 mip 贴图的大小约为 4 * 512 * 512 * 1.33 = 1.33MB。总共需要 359.1MB 将纹理加载到内存中。

这是最坏的情况,在中/高端机器上没问题,但一旦 WebGL 在 Android 和低规格机器上广泛使用,我也想针对移动设备进行优化。

如果我将纹理减少到 256x256,我会注意到质量有所损失,但这可能是低端设备的一个选择。这导致每个纹理总共 4 * 256 * 256 * 1.33 = 0.33MB,总共 89.1MB。

在尝试将纹理加载到 WebGL 上下文之前,是否有 API 可以确定总的可用纹理内存?

同时可以加载到内存中的纹理总数是否也有上限?

我想在用户加载我的页面时使用上述两个参数来获得合理的默认值。

webgl
2个回答
1
投票

据我所知,没有办法做到这一点。从 Toji 的answer来看,这听起来像是出于安全原因。

我会考虑谁将使用您的应用程序,如果这组用户除了在桌面上拥有出色的专用显卡的严格用户之外,还可以缩小每个人的纹理大小。也许您可以允许更高级别的图形作为选项,但要意识到这可能会导致某些/大多数人出现内存不足异常。

如果碰巧您没有一次使用所有这些纹理,您可以尝试跟踪您正在使用哪些纹理,并仅将它们加载到内存中(并使用

gl.deleteTextures
卸载纹理)。我猜测在运行时删除和加载这么多纹理而不是在启动时删除和加载所有纹理将花费大量时间,因此仔细执行(一次仅几个)以保持帧速率将是明智的。不确定您是否能够在一帧中加载 1.33MB 纹理,或者这是否适用于您的应用程序。


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);
© www.soinside.com 2019 - 2024. All rights reserved.