【问题标题】:webgl replace program shaderwebgl 替换程序着色器
【发布时间】:2017-07-10 22:00:59
【问题描述】:

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

我最终得到单色输出(而不是纹理),有人知道我做错了什么吗?我知道正在使用着色器,因为颜色会相应变化。

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

【问题讨论】:

  • 您应该创建多个着色器程序,而不是更改现有着色器程序上的着色器。为您使用的每种功能组合创建着色器程序。

标签: webgl fragment-shader


【解决方案1】:
  • 我假设你调用了 gl.compileShader(fragmentShader);
  • 您是否尝试在不同的浏览器上测试代码并查看是否得到相同的行为? (可能是特定于标准实施的)
  • 您是否尝试在分离后立即删除片段着色器 (gl.deleteShader(attachedFS); )。这 以前的着色器可能仍然在内存中有一个指针。
  • 如果这不能让您继续前进,您可能必须分离两个着色器(顶点和碎片)并重新附加它们,甚至从头开始重新创建程序

【讨论】:

  • 感谢您的建议!我会试一试并报告
  • 假设 WebGL 实现中没有错误或 GPU 驱动程序分离着色器就足够了,无需删除它,也无需从头开始重新创建整个程序。从 OP 提供的源代码中的 cmets 来看,我倾向于错误地设置属性指针和/或变量。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    相关资源
    最近更新 更多