webgl替换程序着色器

时间:2017-07-09 14:38:10

标签: webgl fragment-shader

我试图交换程序中使用的fragement-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();

2 个答案:

答案 0 :(得分:1)

  • 我假设你已经调用了gl.compileShader(fragmentShader);
  • 您是否尝试在其他浏览器上测试代码并查看是否获得相同的行为? (可能是标准实施特定的)
  • 您是否尝试在分离后立即删除片段着色器(gl.deleteShader(attachedFS);)。该 以前的着色器可能仍然在内存中有一个指针。
  • 如果这不能让你向前移动,你可能需要分离两个着色器(顶点和碎片)并重新连接它们甚至从头开始重新创建程序

答案 1 :(得分:0)

我在没有结果的情况下尝试了其他一切后发现了这个问题。它还解释了为什么我看到着色器更改,但只是变得平坦的颜色。我没有更新一些属性。