听着周杰伦的歌,写着3D WebGL,爽啊😁

138 阅读2分钟

前言

你是前端吗?你会搞3D可视化吗?

不会没关系

此文带你三分钟入手WebGL

概念

WebGL,全称(Web Graphics Library),直译过来(网络 图形 库),是一种3D绘图协议。

WebGL可以运行在不同硬件上的浏览器,在保留Web应用的便利性的同时,添加了酷炫的3D功能,实现三维互动网页。 也就是一种web端的3D技术。

通过WebGL,你可以做什么实现什么❓

  • 交互式动画
  • 三维产品配置器
  • 交互式演示文稿
  • 在线商店
  • 产品功能展示应用
  • 三维互动课件
  • 3D游戏
  • ...等等

操作

手摸手牵你入门

创建canvas画布

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

获取画布

const canvas = document.getElementById('canvas');

获取webgl绘图上下文

const gl = canvas.getContext('webgl');

清空绘图区的颜色

gl.clearColor(0,0,0,1);

清空绘图区算法

gl.clear(gl.COLOR_BUFFER_BIT);

最后得到

截屏2023-02-02下午5.40.05.png

换个红色的绘图区

gl.clearColor(255,0,0,1);

截屏2023-02-02下午5.44.17.png

手摸手牵你入第二道门(加了着色器)

WebGL在电脑的GPU中运行。因此需要能够在GPU上运行的代码。

这种代码需要提供成对的方法。一个是顶点着色器,一个是片段着色器。每一对组合起来叫做着色程序。

那么在代码中加入这两种着色器的代码,如下:

创建以及获取着色器

顶点着色器

<script id="vertexShader" type="x-shader/x-vertex">
    void main() {
        gl_Position = vec4(0.0, 0.0, 0.0, 1.0)
        gl_PointSize = 100.0
    }
<script>

片段着色器

<script id="fragmentShader" type="x-shader/x-fragment">
void main() {
    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0)
}
</script>

分别获取这两种着色器的文本

const vsSource = document.getElementById("vertexShader").innerText
const fsSource = document.getElementById("fragmentShader").innerText

初始化着色器

建立程序对象

const program = gl.createProgram()

根据着色类型 创建着色器对象

顶点着色器

const vertexShader = gl.createShader(gl.VERTEX_SHADER)

gl.shaderSource(vertexShader, vsSource) // 将着色器源文件传入着色器对象中

gl.compileShader(vertexShader) // 编译着色器对象

片段着色器

const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)

gl.shaderSource(fragmentShader, fsSource) // 将着色器源文件传入着色器对象中

gl.compileShader(fragmentShader) // 编译着色器对象

将顶点着色器和片段着色器放入程序对象中

gl.attachShader(program, vertexShader)
gl.attachShader(program, fragmentShader)

把webgl上下文和程序对象连接起来, 并把程序对象挂到webgl上下文中

gl.linkProgram(program)
gl.useProgram(program)

绘制顶点

gl.drawArrays(gl.POINTS, 0, 1)

最后得到效果就是在画布中间有一片方正的青青草地,为什么是绿色呢,就是我们片段着色器给什么颜色就出什么颜色,由于绿色是#00FF00, 对应的就是vec4(0.0, 1.0, 0.0, 1.0)

截屏2023-02-02下午6.15.44.png

这个例子简单吧,要是想要酷炫的例子,可以看看这个网站,保证能激发起你学webgl的巨大兴趣和决心。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天 点击查看活动详情