WebGL着色器创建问题

时间:2010-11-28 11:30:44

标签: javascript shader webgl

我正在尝试在WebGl和JavaScript中创建一个简单的应用程序,虽然我在互联网上找到了一些教程,但在创建一些基本着色器时遇到了一个奇怪的问题。创建着色器程序的函数如下所示:

 this.CreateShaderProgram = function(vertexShader, fragmentShader)
  {
    var tmp = this.gl.createProgram();

    var tempVert = this.gl.createShader(this.gl.VERTEX_SHADER);     
    this.gl.shaderSource(tempVert, vertexShader);
    this.gl.compileShader(tempVert);
    if(!this.gl.getShaderParameter(tempVert, this.gl.COMPILE_STATUS)) {
          this.Log("invalid shader : " + vertexShader);
          return null;
    };

    var tempFrag = this.gl.createShader(this.gl.FRAGMENT_SHADER); 
    this.gl.shaderSource(tempFrag, fragmentShader);
    this.gl.compileShader(tempFrag);    
    if(!this.gl.getShaderParameter(tempFrag, this.gl.COMPILE_STATUS)) {
          this.Log("invalid shader : " + fragmentShader);
          return null;
    };

    this.gl.attachShader(tmp, tempVert);
    this.gl.attachShader(tmp, tempFrag);

    return tmp;
  }

这两个着色器看起来像:

  attribute vec3 aVertexPosition;
  uniform mat4 uMVMatrix;
  uniform mat4 uPMatrix;
  void main(void) {
         gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
  }
  --------------------------------------------  

  #ifdef GL_ES  precision highp float;
  #endif
  void main(void) { 
  gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);  };

奇怪的是,第一个顶点着色器成功编译,但是对于片段着色器,它在“this.gl.compileShader(tempFrag);”上崩溃了。我无法弄清楚原因。

2 个答案:

答案 0 :(得分:4)

如果你不知道它为什么不编译,那么改变你的代码:

this.gl.compileShader(tempFrag);    
if(!this.gl.getShaderParameter(tempFrag, this.gl.COMPILE_STATUS)) {
      this.Log("invalid shader : " + this.gl.getShaderInfoLog(tempFrag));
      return null;
};

这可以为您提供有关错误的更多信息(可能使用#ifdef

答案 1 :(得分:4)

您的代码中的代码段:

#ifdef GL_ES  precision highp float;
#endif

应分开:

#ifdef GL_ES
precision highp float;
#endif

这是因为着色语言使用预处理器,就像C Preprocessor一样。以#开头的行是预处理程序指令,它跨越整行。而precision声明不是;这只是GLSL中的正常陈述。将它们放在同一行会混淆预处理器,因为它将精度语句视为其指令的一部分。

Zecc建议使用getShaderInfoLog对于调试这些问题也非常宝贵。