webgl 替换程序着色器
webgl replace program shader
我正在尝试更换程序中使用的碎片着色器。片段着色器都有相同的变量,只是计算不同。我正在尝试为较低级别的硬件提供替代着色器。
我最终得到单色输出(而不是纹理),有人知道我可能做错了什么吗?我知道正在使用着色器,因为颜色会相应变化。
//if I don't do this:
//WebGL: INVALID_OPERATION: attachShader: shader attachment already has shader
gl.detachShader(program, _.attachedFS);
//select a random shader, all using the same parameters
attachedFS = fragmentShaders[~~(Math.qrand()*fragmentShaders.length)];
//attach the new shader
gl.attachShader(program, attachedFS);
//if I don't do this nothing happens
gl.linkProgram(program);
//if I don't add this line:
//globject.js:313 WebGL: INVALID_OPERATION: uniform2f:
//location not for current program
updateLocations();
- 我假设您调用了 gl.compileShader(fragmentShader);
- 您是否尝试过在不同的浏览器上测试代码,看看您是否得到相同的行为? (它可能是特定于标准实现的)
- 您是否尝试过在分离后立即删除片段着色器 (gl.deleteShader(attachedFS); )。这
以前的着色器可能仍然在内存中有一个指针。
- 如果这不能让您继续前进,您可能必须分离两个着色器(顶点和碎片)并重新连接它们,甚至从头开始重新创建程序
在尝试了所有其他方法都没有结果后,我发现了这个问题。它还解释了为什么我看到着色器发生了变化,但只是得到了一个单一的颜色。我没有更新某些属性。
我正在尝试更换程序中使用的碎片着色器。片段着色器都有相同的变量,只是计算不同。我正在尝试为较低级别的硬件提供替代着色器。
我最终得到单色输出(而不是纹理),有人知道我可能做错了什么吗?我知道正在使用着色器,因为颜色会相应变化。
//if I don't do this:
//WebGL: INVALID_OPERATION: attachShader: shader attachment already has shader
gl.detachShader(program, _.attachedFS);
//select a random shader, all using the same parameters
attachedFS = fragmentShaders[~~(Math.qrand()*fragmentShaders.length)];
//attach the new shader
gl.attachShader(program, attachedFS);
//if I don't do this nothing happens
gl.linkProgram(program);
//if I don't add this line:
//globject.js:313 WebGL: INVALID_OPERATION: uniform2f:
//location not for current program
updateLocations();
- 我假设您调用了 gl.compileShader(fragmentShader);
- 您是否尝试过在不同的浏览器上测试代码,看看您是否得到相同的行为? (它可能是特定于标准实现的)
- 您是否尝试过在分离后立即删除片段着色器 (gl.deleteShader(attachedFS); )。这 以前的着色器可能仍然在内存中有一个指针。
- 如果这不能让您继续前进,您可能必须分离两个着色器(顶点和碎片)并重新连接它们,甚至从头开始重新创建程序
在尝试了所有其他方法都没有结果后,我发现了这个问题。它还解释了为什么我看到着色器发生了变化,但只是得到了一个单一的颜色。我没有更新某些属性。