为什么要使用 WebGL/GPU 怎样使用 WebGL(WebGL 入门第一步) 更多读物
光栅(Raster):几乎所有的现代图形系统都是基于光栅来绘制图形的,光栅就是指构成图像的像素阵列。
像素(Pixel):一个像素对应图像上的一个点,它通常保存图像上的某个具体位置的颜色等信息。
帧缓存(Frame Buffer):在绘图过程中,像素信息被存放于帧缓存中,帧缓存是一块内存地址。
CPU(Central Processing Unit):中央处理单元,负责逻辑计算。
GPU(Graphics Processing Unit):图形处理单元,负责图形计算。
一般来说,在图形绘制时,有以下步骤:
CPU 的优势在于:CPU 能够处理大计算量的任务,但是 CPU 的并行处理有上限
GPU 的优势在于:GPU 的计算量处理能力不大,但是 GPU 中的所有计算都可以并行处理
因为图形渲染的像素处理数量一般都是非常大的,但是每个像素的计算量却不大,所以 GPU 处理图形渲染就非常有优势
Vertex Shader
attribute vec2 position;
void main() {
gl_Pointsize = 1.0; // 设置像素点大小为 1.0
gl_Position = vec4(position,1.0,1.0 );
}
Fragment Shader
precision mediump float;
void main() {
// 每个像素都被并行执行这段代码,设置了像素的颜色
gl_Fragcolor = vec4(1.0,0.0,0.0,1.0 );
}
着色器内可以执行向量运算,并且定义的变量可以共享:
webgl 是一个很底层的 API,所以创建 webgl 程序也是个比较复杂的过程,类似编译器的工作需要自己写
const canvas = document.querySelector('canvas');
const gl = canvas.getContext('webgl');
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);
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program) ;
如何创建一个三角形?
const points = new Float32Array([
-1, -1, // 坐标 (-1, -1)
0, 1, // 坐标 (0, 1)
1, -1, // 坐标 (1, -1)
]);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES, 0, points.length / 2);
如何绘制一个多边形?
可以使用 Earcut 库进行三角剖分
一般来说,3D 的模型是在设计软件里先设计好再导出,而不是像 2D 一样实时计算
3D 标准模型的四个齐次矩阵(mat4)