WebGL绘制个最简单的三角形

2019-12-11  本文已影响0人  jadefan

在webgl中的hello world就是绘制个三角形,本例绘制了一个最简单的三角形
效果图:



代码:

<body>
  <canvas id="canvas"></canvas>

  <script id="vertexShader" type="x-webgl">
      attribute vec2 position; 
      void main(){
        gl_Position = vec4(position, 0.0, 1.0); 
      }
    </script>

  <script id="fragmentShader" type="x-weggl">
      #ifdef GL_ES
        precision mediump float;
      #endif
      uniform vec4 uColor;
      void main(){
        gl_FragColor = uColor;
      }
    </script>

  <script> 
    // 获取着色器代码
    var vertexGlsl = document.getElementById('vertexShader').text;
    var fragmentGlsl = document.getElementById('fragmentShader').text;

    var canvas = document.getElementById('canvas');
    // 获取webgl上下文
    var gl = canvas.getContext('webgl');
    // 判断是否支持
    if (!gl) {
      console.log("不支持webgl");
    }

    // 用指定颜色清理画布
    gl.clearColor(0, 0, 0, 1);
    gl.clear(gl.COLOR_BUFFER_BIT);

    // 编译着色器
    var vertexShader = gl.createShader(gl.VERTEX_SHADER);
    gl.shaderSource(vertexShader, vertexGlsl);
    gl.compileShader(vertexShader);

    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
    gl.shaderSource(fragmentShader, fragmentGlsl);
    gl.compileShader(fragmentShader);

    // 错误检测
    if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
      alert(gl.getShaderInfoLog(vertexShader));
    }
    if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
      alert(gl.getShaderInfoLog(fragmentShader));
    }

    // 链接着色器
    var program = gl.createProgram();
    gl.attachShader(program, vertexShader);
    gl.attachShader(program, fragmentShader);
    gl.linkProgram(program);
    gl.useProgram(program);

    // 错误检测
    if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
      alert(gl.getProgramInfoLog(program));
    }

    // 顶点定义
    var vertices = new Float32Array([
         0,  0.5,
       0.5, -0.5,
      -0.5, -0.5
    ]);

    // 顶点缓冲区
    var buffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);

    // 颜色传值
    var uColor = gl.getUniformLocation(program, 'uColor');
    gl.uniform4fv(uColor, [1.0, 0.0, 0.0, 1.0]);

    // 顶点传值
    var position = gl.getAttribLocation(program, 'position');
    gl.vertexAttribPointer(position, 2, gl.FLOAT, false, 0, 0);
    gl.enableVertexAttribArray(position);

    // 图形绘制
    gl.drawArrays(gl.TRIANGLES, 0, 3);


  </script>
</body>

</html>
上一篇 下一篇

猜你喜欢

热点阅读