- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Titletitle>
- head>
- <body>
- <canvas width="300" height="300">canvas>
-
- <script>
- let canvas = document.querySelector('canvas');
- let gl = canvas.getContext('webgl');
- //在 GLSL 中,attribute 表示声明变量,vec2 是变量的类型,它表示一个二维向量,position 是变量名。接下来我们将 buffer 的数据绑定给顶点着色器的 position 变量。
- //着色器 顶点和图元构成
- const vertex = `
- attribute vec2 position;
- varying vec3 color;
- void main() {
- gl_PointSize = 1.0;
- color = vec3(0.5 + position * 0.5, 0.0);
- gl_Position = vec4(position * 0.5, 1.0, 1.0);
- }
- `;
- //片元
- const fragment = `
- precision mediump float;
- varying vec3 color;
- void main(){
- gl_FragColor = vec4(color, 1.0);
- }
- `
- //构建片元着色器
- //传入顶点 传入图元
- //着色器 分为两部分 一个顶点着色器 一个片元着色器
- const vertexShader = gl.createShader(gl.VERTEX_SHADER)
- gl.shaderSource(vertexShader, vertex);
- gl.compileShader(vertexShader)
-
- const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)
- gl.shaderSource(fragmentShader,fragment)
- gl.compileShader(fragmentShader)
- // 关联着色器
- let webGLProgram = gl.createProgram();
- gl.attachShader(webGLProgram,vertexShader);
- gl.attachShader(webGLProgram, fragmentShader);
- gl.linkProgram(webGLProgram)
- //使用webGLProgram程序
- gl.useProgram(webGLProgram)
-
- //构建顶点数据
- //webGL需要使用类型数组定义 默认格式:FloatArray
- const points = new Float32Array([
- -1,-1,
- 0, 1,
- 1, -1
- ])
- //将数据写入缓冲区 createBuffer bindBuffer bufferData
- let webGLBuffer = gl.createBuffer();
- gl.bindBuffer(gl.ARRAY_BUFFER, webGLBuffer);
-
- //webgl支持的图元类型有七种,分别是 gl.POINTS(点), gl.LINES(线段), gl.LINE_STRIP(线条), gl.LINE_LOOP(回路), gl.TRIANGLES(三角形), gl.TRIANGLE_STRIP(三角带), gl.TRIANGLE_FAN(三角扇)。
- //要绘制空心三角形,gl.LINE_STRIP(线条)、gl.LINES(线段)、 gl.LINE_LOOP(回路)都可以实现
-
- gl.bufferData(gl.ARRAY_BUFFER,points,gl.STATIC_DRAW)
-
- //将数据写道cpu
- //获取顶点 着色器中的position变量的地址
- const vPosition = gl.getAttribLocation(webGLProgram, 'position');
- //给变量设置长度和类型
- gl.vertexAttribPointer(vPosition, 2, gl.FLOAT, false, 0, 0);
- //激活这个变量
- gl.enableVertexAttribArray(vPosition);
- //最后一步数据绘图
- gl.clear(gl.COLOR_BUFFER_BIT);
- gl.drawArrays(gl.TRIANGLES, 0, points.length / 2);
- script>
-
-
- body>
- html>