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); )。这 以前的着色器可能仍然在内存中有一个指针。
  • 如果这不能让您继续前进,您可能必须分离两个着色器(顶点和碎片)并重新连接它们,甚至从头开始重新创建程序

在尝试了所有其他方法都没有结果后,我发现了这个问题。它还解释了为什么我看到着色器发生了变化,但只是得到了一个单一的颜色。我没有更新某些属性。