WebGL中工作项(着色器实例)内存的限制是什么?

时间:2015-07-10 23:46:26

标签: glsl webgl

我在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。我猜我试图在堆栈上使用太多内存。有没有更好的,程序化的方法来发现这个限制?我做错了吗?

1 个答案:

答案 0 :(得分:3)

  

没有错误 - 着色器编译,编程链接并传递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