webgl学习 一画点
<html>
<head>
<meta lang="en">
<meta charset="UTF-8">
<title>点击绘制点</title>
<script src="./cuon-utils.js"></script>
<style>
body{
margin:0;
}
canvas{
border:1px solid #999;
}
</style>
</head>
<body>
<canvas id="canvas" width="500" height="500"></canvas>
</body>
<script>
// 顶点着色器
const vertexShader = `
attribute vec4 a_position;
void main () {
// gl_Position为内置变量,表示当前点的位置
gl_Position = a_position;
// gl_Position为内置变量,表示当前点的大小,为浮点类型,如果赋值是整数类型会报错
gl_PointSize = 3.0;
}
`;
// 片元着色器
const fragmentShader = `
// 设置浮点数精度
precision mediump float;
void main () {
// vec4是表示四维向量,这里用来表示RGBA的值[0~1],均为浮点数,如为整数则会报错
gl_FragColor = vec4(1.0, 0.5, 1.0, 1.0);
}
`;
// 获取canvas元素
var canvas = document.getElementById('canvas');
// 获取绘制二维上下文
var gl = canvas.getContext('webgl');
/**
*
* @param {WebGLRenderingContext} gl
* @param {string} type
* @param {string} source
*/
function createShader(gl, type, source) {
// 创建 shader 对象
let shader = gl.createShader(type);
// 往 shader 中传入源代码
gl.shaderSource(shader, source);
// 编译 shader
gl.compileShader(shader);
// 判断 shader 是否编译成功
let success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
if (success) {
return shader;
}
// 如果编译失败,则打印错误信息
console.log(gl.getShaderInfoLog(shader));
gl.deleteShader(shader);
}
/**
*
* @param {WebGLRenderingContext} gl
* @param {WebGLShader} vertexShader
* @param {WebGLShader} fragmentShader
*/
function createProgram(gl, vertexShader, fragmentShader) {
// 创建 program 对象
let program = gl.createProgram();
// 往 program 对象中传入 WebGLShader 对象
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
// 链接 program
gl.linkProgram(program);
// 判断 program 是否链接成功
let success = gl.getProgramParameter(program, gl.LINK_STATUS);
if (success) {
return program;
}
// 如果 program 链接失败,则打印错误信息
console.log(gl.getProgramInfoLog(program));
gl.deleteProgram(program);
}
/**
*
* @param {WebGLRenderingContext} gl
* @param {string} vertexSource
* @param {string} fragmentSource
*/
function initWebGL(gl, vertexSource, fragmentSource) {
// 根据源代码创建顶点着色器
let vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexSource);
// 根据源代码创建片元着色器
let fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
// 创建 WebGLProgram 程序
let program = createProgram(gl, vertexShader, fragmentShader);
return program;
}
// 初始化shader程序
const program = initWebGL(gl, vertexShader, fragmentShader);
// 告诉WebGL使用我们刚刚初始化的这个程序
gl.useProgram(program);
// initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE);
clear();
var points = [];
// canvas.addEventListener('click', (e) => {
// var pos = getClickedPosOnCanvas(canvas, e.clientX, e.clientY);
// points.push(pos);
// clear();
// var a_Position = gl.getAttribLocation(gl.program, 'a_Position');
// points.forEach(p => {
// gl.vertexAttrib2f(a_Position, p.x, p.y);
// /* 绘制一个点 */
// gl.drawArrays(gl.POINTS, 0, 1);
// });
// });
var i = 0;
var pointPos = [
-1, -1,
0.5, 0.0,
1.0, 1
];
var t2 = window.setInterval(function() {
var x=i/500, y=i%500;
var pos = getClickedPosOnCanvas(canvas,x, y);
//20hz插入五个点
points.push(pos.x);
points.push(pos.y);
points.push(pos.x+0.4);
points.push(pos.y);
points.push(pos.x+0.8);
points.push(pos.y);
points.push(pos.x+1.2);
points.push(pos.y);
points.push(pos.x+1.6);
points.push(pos.y);
clear();
// -----------------------------------------------------
// 注意:这里必须采用类型化数组往WebGL传入attribute类型的数据
// -----------------------------------------------------
var buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(points), gl.STATIC_DRAW);
var a_position = gl.getAttribLocation(program, 'a_position');
// gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
// gl.enableVertexAttribArray(a_Position);
gl.vertexAttribPointer(
a_position,
2,
gl.FLOAT,
false,
Float32Array.BYTES_PER_ELEMENT * 2,
0
);
gl.enableVertexAttribArray(a_position);
gl.drawArrays(gl.POINTS, 0, points.length);
i++;
},50)
function getClickedPosOnCanvas(canvas, clientX, clientY) {
var rect = canvas.getBoundingClientRect();
var halfCanvasWidth = canvas.width / 2;
var halfCanvasHeight = canvas.height / 2;
var x = (clientX - rect.left - halfCanvasWidth) / halfCanvasWidth;
var y = (halfCanvasHeight - (clientY - rect.top)) / halfCanvasHeight;
return {x, y};
}
function clear() {
gl.clearColor(0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
}
</script>

cpu毫无压力 将近500*400=20w个点了
浙公网安备 33010602011771号