美文网首页
Webgl学习笔记 1 初始化shader

Webgl学习笔记 1 初始化shader

作者: AlanFu | 来源:发表于2019-11-18 21:09 被阅读0次

    编译GLSL ES代码,创建和初始化着色器供WebGL使用.

    1,创建着色器对象 (gl.createShader());
    2,向着色器中填充着色器程序的源代码(gl.shaderSource())
    3,编译着色器(gl.compileShader())
    4,创建程序对象(gl.createPorgram())
    5,为程序对象分配着色器(gl.attachShader())
    6,连接程序对象(gl.linkProgram())
    7,使用程序对象(gl.useProgram())

    具体代码实现如下

    /**
     * Create a program object and make current
     * @param gl GL context
     * @param vshader a vertex shader program (string)
     * @param fshader a fragment shader program (string)
     * @return true, if the program object was created and successfully made current 
     */
    function initShaders(gl, vshader, fshader) {
      var program = createProgram(gl, vshader, fshader);
      if (!program) {
        console.log('Failed to create program');
        return false;
      }
    
      gl.useProgram(program);
      gl.program = program;
    
      return true;
    **
     * Create the linked program object
     * @param gl GL context
     * @param vshader a vertex shader program (string)
     * @param fshader a fragment shader program (string)
     * @return created program object, or null if the creation has failed
     */
    function createProgram(gl, vshader, fshader) {
      // Create shader object
      var vertexShader = loadShader(gl, gl.VERTEX_SHADER, vshader);
      var fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fshader);
      if (!vertexShader || !fragmentShader) {
        return null;
      }
    
      // Create a program object
      var program = gl.createProgram();
      if (!program) {
        return null;
      }
    
      // Attach the shader objects
      gl.attachShader(program, vertexShader);
      gl.attachShader(program, fragmentShader);
    
      // Link the program object
      gl.linkProgram(program);
    
      // Check the result of linking
      var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
      if (!linked) {
        var error = gl.getProgramInfoLog(program);
        console.log('Failed to link program: ' + error);
        gl.deleteProgram(program);
        gl.deleteShader(fragmentShader);
        gl.deleteShader(vertexShader);
        return null;
      }
      return program;
    }
    
    /**
     * Create a shader object
     * @param gl GL context
     * @param type the type of the shader object to be created
     * @param source shader program (string)
     * @return created shader object, or null if the creation has failed.
     */
    function loadShader(gl, type, source) {
      // Create shader object
      var shader = gl.createShader(type);
      if (shader == null) {
        console.log('unable to create shader');
        return null;
      }
    
      // Set the shader program
      gl.shaderSource(shader, source);
    
      // Compile the shader
      gl.compileShader(shader);
    
      // Check the result of compilation
      var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
      if (!compiled) {
        var error = gl.getShaderInfoLog(shader);
        console.log('Failed to compile shader: ' + error);
        gl.deleteShader(shader);
        return null;
      }
    
      return shader;
    }```

    相关文章

      网友评论

          本文标题:Webgl学习笔记 1 初始化shader

          本文链接:https://www.haomeiwen.com/subject/nzqyictx.html