前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WebGL基础 - 笔记

WebGL基础 - 笔记

作者头像
TagBug
发布2023-03-17 11:28:20
7290
发布2023-03-17 11:28:20
举报
文章被收录于专栏:TagBug

为什么要使用 WebGL/GPU 怎样使用 WebGL(WebGL 入门第一步) 更多读物

# WebGL 基础 - 笔记

# Why WebGL/Why GPU?

# WebGL 是什么?

  • GPU ≠ WebGL ≠ 2D
  • WebGL 是浏览器上的 OpenGL
  • 需要一定计算机图形学基础和线性代数基础

# Modern Graphics System

image-20220121101001922
image-20220121101001922

光栅(Raster):几乎所有的现代图形系统都是基于光栅来绘制图形的,光栅就是指构成图像的像素阵列。

像素(Pixel):一个像素对应图像上的一个点,它通常保存图像上的某个具体位置的颜色等信息。

帧缓存(Frame Buffer):在绘图过程中,像素信息被存放于帧缓存中,帧缓存是一块内存地址。

CPU(Central Processing Unit):中央处理单元,负责逻辑计算。

GPU(Graphics Processing Unit):图形处理单元,负责图形计算。

一般来说,在图形绘制时,有以下步骤:

  1. 轮廓提取 /meshing
  2. 光栅化
  3. 帧缓存
  4. 渲染

# CPU vs GPU

CPU 的优势在于:CPU 能够处理大计算量的任务,但是 CPU 的并行处理有上限

GPU 的优势在于:GPU 的计算量处理能力不大,但是 GPU 中的所有计算都可以并行处理

因为图形渲染的像素处理数量一般都是非常大的,但是每个像素的计算量却不大,所以 GPU 处理图形渲染就非常有优势

# WebGL Startup

  1. 创建 WebGL 上下文
  2. 创建 WebGL Program
  3. 将数据存入缓冲区
  4. 将缓冲区数据读取到 GPU
  5. GPU 执行 WebGL 程序,输出结果

# Shaders(着色器)

Vertex Shader

代码语言:javascript
复制
attribute vec2 position;

void main() {
    gl_Pointsize = 1.0; // 设置像素点大小为 1.0
    gl_Position = vec4(position,1.0,1.0 );
}

Fragment Shader

代码语言:javascript
复制
precision mediump float;

void main() {
    // 每个像素都被并行执行这段代码,设置了像素的颜色
    gl_Fragcolor = vec4(1.0,0.0,0.0,1.0 );
}

着色器内可以执行向量运算,并且定义的变量可以共享:

image-20220121104127381
image-20220121104127381

# Create Program

webgl 是一个很底层的 API,所以创建 webgl 程序也是个比较复杂的过程,类似编译器的工作需要自己写

代码语言:javascript
复制
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) ;

# Data to Frame Buffer

image-20220121103211058
image-20220121103211058

如何创建一个三角形?

代码语言:javascript
复制
const points = new Float32Array([
    -1, -1, // 坐标 (-1, -1)
    0, 1,   // 坐标 (0, 1)
    1, -1,  // 坐标 (1, -1)
]);

# Frame Buffer to GPU

image-20220121103453798
image-20220121103453798

# Output

代码语言:javascript
复制
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES, 0, points.length / 2);

# WebGL 的封装库 —Mesh.js

image-20220121104552327
image-20220121104552327

# Polygons

如何绘制一个多边形?

  • 三角剖分
image-20220121104708110
image-20220121104708110

可以使用 Earcut 库进行三角剖分

# 3D Meshing

一般来说,3D 的模型是在设计软件里先设计好再导出,而不是像 2D 一样实时计算

# Transform

image-20220121105114995
image-20220121105114995
image-20220121105325055
image-20220121105325055

# 3D Matrix

3D 标准模型的四个齐次矩阵(mat4)

  1. 投影矩阵 Projection Matrix
  2. 模型矩阵 Model Matrix
  3. 视图矩阵 View Matrix
  4. 法向量矩阵 Normal Matrix

# Read More

  1. The book of shaders
  2. Mesh.js
  3. glsl-doodle
  4. SpriteJS
  5. ThreeJS
  6. shadertoy.com

# 参考资料

  • 字节青训营课程
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-212,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # WebGL 基础 - 笔记
    • # Why WebGL/Why GPU?
      • # WebGL 是什么?
      • # Modern Graphics System
      • # CPU vs GPU
    • # WebGL Startup
      • # Shaders(着色器)
      • # Create Program
      • # Data to Frame Buffer
      • # Frame Buffer to GPU
      • # Output
      • # WebGL 的封装库 —Mesh.js
      • # Polygons
      • # 3D Meshing
      • # Transform
      • # 3D Matrix
    • # Read More
      • # 参考资料
      相关产品与服务
      流计算 Oceanus
      流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的企业级实时大数据分析平台,具备一站开发、无缝连接、亚秒延时、低廉成本、安全稳定等特点。流计算 Oceanus 以实现企业数据价值最大化为目标,加速企业实时化数字化的建设进程。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档