Проблема создания шейдера WebGL - PullRequest
1 голос
/ 28 ноября 2010

Я пытаюсь сделать простое приложение на 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;
  }

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

Странно то, что первый Vertex Shader успешно компилируется, но длядля фрагментного шейдера происходит сбой в "this.gl.compileShader (tempFrag);"линия, и я не могу понять, почему.

Ответы [ 2 ]

4 голосов
/ 28 ноября 2010

Этот фрагмент из вашего кода:

#ifdef GL_ES  precision highp float;
#endif

Должен быть в отдельных строках:

#ifdef GL_ES
precision highp float;
#endif

Это потому, что язык затенения использует препроцессор, очень похожий на CПрепроцессор .строки, начинающиеся с #, являются директивами препроцессора, охватывающими всю строку.Принимая во внимание, что утверждение precision не является;это просто нормальное утверждение в GLSL.Помещение их в одну строку сбивает с толку препроцессор, потому что он рассматривает выражение точности как часть своей директивы.

Совет Zecc по использованию getShaderInfoLog также неоценим для устранения проблем такого рода.

4 голосов
/ 28 ноября 2010

Если вы не знаете, почему он не компилируется, измените ваш код следующим образом:

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

Это должно дать вам больше информации о том, что неправильно (возможно, использование #ifdef)

...