【问题标题】:What is the limit on work item (shader instance) memory in WebGL?WebGL 中工作项(着色器实例)内存的限制是多少?
【发布时间】:2015-07-12 14:35:31
【问题描述】:

我在我的 WebGL 顶点着色器中声明了一个数组:

属性vec2位置;

void main() {

  #define length 1024
  float arr[length];
  // use arr so that it doesn't get optimized away

这可行,但如果我将 length 增加到 2048,那么 gl.drawArrays 什么也不做。没有错误-着色器编译,程序链接并通过gl.validateProgram。我猜我试图在堆栈上使用太多内存。有没有更好的程序化方式来发现这个限制?我做错了什么吗?

【问题讨论】:

  • GLSL 没有堆栈。
  • 那我该怎么称呼它呢?
  • 非功能性glDrawArrays() 是否会导致glGetError() 返回GL_INVALID_OPERATION
  • @genpfault 不,没有错误

标签: glsl webgl


【解决方案1】:

没有错误 - 着色器编译、程序链接并通过 gl.validateProgram。

按照规范保证!

Section 2.10: "Vertex Shaders", page 42:

着色器不应编译失败,程序对象不应编译失败 由于缺少指令空间或缺少临时变量而导致的链接。

GLSL 规范很有帮助地指出:

Appendix A, section 3: "Usage of Temporary Variables":

最大变量数由conformance tests 定义。

您可以通过$14,000-$19,000 的低价获得您自己的一致性测试副本。

但是,您至少可以检测这种情况(第 2.10 节,第 41 页):

并不总是可以在链接时确定程序对象是否真的会执行。因此,在发出第一个渲染命令(DrawArrays 或 DrawElements)时进行验证,以确定当前活动的程序对象是否可以执行。如果无法执行,则不会渲染任何片段,渲染命令会产生错误INVALID_OPERATION

【讨论】:

  • WebGL 的一致性测试是免费的、开源的 (MITed) 并且可用here
  • 你知道哪个测试引用了最大内存吗?此外,这些测试的来源似乎是here
猜你喜欢
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
  • 2017-03-13
  • 2014-03-24
  • 2012-06-21
相关资源
最近更新 更多