2017-07-09 92 views
0

我想交换程序中使用的fragement-shader。片段着色器都具有相同的变量,只是不同的计算。我正在尝试为低级硬件提供替代着色器。webgl替换程序着色器

我最终得到单色输出(而不是纹理),有没有人有一个想法,我可能做错了什么?由于颜色相应改变,我知道着色器正在使用。

 //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(); 
+0

您应该可以创建多个着色器程序,而不是更改现有着色器程序中的着色器。为您使用的每个功能组合创建着色器程序。 – gman

回答

0

我发现这个问题,试图了解一切后,没有结果。这也解释了为什么我看到着色器的变化,但只是获得了平坦的颜色。我没有更新一些属性。

1
  • 我假设你已经调用gl.compileShader(fragmentShader);
  • 您是否尝试过在不同的浏览器上测试代码并查看是否得到相同的行为? (它可能是特定于标准实现的)
  • 您是否尝试在分离它之后立即删除片段着色器(gl.deleteShader(attachedFS);)。之前的着色器在内存中可能仍有一个指针。
  • 如果这不会让你前进,你可能必须分离这两种着色器(顶点&破片),并重新连接他们甚至从头开始重建程序
+0

感谢您的建议!我会试一试并回报 – marcgfx

+0

假设在WebGL实现或GPU驱动程序中没有错误,则将着色器分离就足够了,不需要删除它,也不需要重新创建整个程序。根据OP提供的源代码中的评论来判断,我倾向于错误地设置属性指针和/或变化。 –

+0

你说得对LJ ... – marcgfx