【问题标题】:How many textures can I use in a webgl fragment shader?我可以在 webgl 片段着色器中使用多少个纹理?
【发布时间】:2013-12-30 08:43:07
【问题描述】:

简单的问题,但我无法在任何地方的规范中找到答案。我可能在某处遗漏了明显的答案。

我可以在 WebGL 片段着色器中一次使用多少个纹理?如果它是可变的,假设 PC 使用的合理数字是多少? (对移动设备不太感兴趣)。

我的一个着色器中至少需要 23 个,所以想知道在我开始编写代码之前是否能够做到这一点,或者我是否需要进行多次传递。

【问题讨论】:

  • 我从一个答案中看到 16 很常见,但它可能会有所不同。该标准是否定义了我可以期望的最低要求?

标签: webgl


【解决方案1】:

我很确定你可以找到

var maxTexturesInFragmentShader = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);

WebGL (OpenGL ES 2.0) 至少需要 8 个片段着色器。

请注意,您可以访问的纹理数量与您可以访问 1 个纹理的次数是分开的。因此,例如,如果您想仅使用 1 个纹理单元访问 2 个纹理,则组合这些纹理并调整您的 UV 坐标。因此,例如将 2 个纹理 [A] 和 [B] 的内容并排放入一个纹理 [AB] 中,然后

vec4 colorFromTexA = texture2D(samplerAB, uvForTexA * vec2(0.5, 1.0));
vec4 colorFromTexB = texture2D(samplerAB, uvForTexB * vec2(0.5, 1.0) + vec2(0.5, 0.0));

当然,您可能需要为没有 mips 等设置过滤...

【讨论】:

  • Hmm 8. 我的应用程序仅适用于台式机,而不是小型手机和其他东西,所以我想我可能可以依赖更多,因为它们似乎都有 16 但我至少需要检查参数在启动时。我想如果无论如何我都必须做多通道,我可能会用更少的时间让它工作。我也许可以组合一些纹理并将它们组合起来,这是一个好主意,但其中大多数我需要平铺。不过,我也许可以在片段着色器代码中做到这一点。谢谢你的想法。
【解决方案2】:

您可以在http://webglstats.com/webgl/parameter/MAX_TEXTURE_IMAGE_UNITS找到答案

您似乎不走运,因为统计数据表明大多数人只有 16 个。

【讨论】:

  • 好的,谢谢,这是一个有用的网站。嗯,好吧,与其说是需要有关我的代码采用哪种方式的信息,不如说是运气不好,如果我可以在一个着色器中完成所有操作,那么进行多次传递毫无意义,但现在我知道我有必要继续使用它: )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
相关资源
最近更新 更多