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