2010-11-28 117 views
1

我想在WebGl和JavaScript中做一个简单的应用程序,并且当我在网上找到一些教程时,在创建一些基本着色器时遇到了一个奇怪的问题。它创建着色器程序的功能如下:WebGL着色器创建问题

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; 
    } 

而且2个着色器看起来像:

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);”线,我不明白为什么。

回答

4

这段代码从代码:

#ifdef GL_ES precision highp float; 
#endif 

应该是在单独的行:

#ifdef GL_ES 
precision highp float; 
#endif 

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

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

+0

是的......这是一个初学者的错误。我现在用一个字符串编写了整个着色器,以使其更快地工作,但是我忘了将它包含在本应该出现的位置。 – 2010-11-28 21:04:01

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