初识 webgl(一)

前言

最近打算整理一下 webgl 相关的基础知识;方便自己复习查看。
首先 webgl 是一种在 web 端进行三维相关开发的技术;引一段 mdn 上的介绍:

WebGL(Web图形库)是一个JavaScript API,可在任何兼容的Web浏览器中渲染高性能的交互式 3D 和 2D 图形,而无需使用插件。WebGL 通过引入一个与 OpenGL ES 2.0 非常一致的 API 来做到这一点,该 API 可以在HTML5 <canvas> 元素中使用。 这种一致性使API可以利用用户设备提供的硬件图形加速。

了解了他是什么,那么我们如何利用 web 技术进行 webgl 的开发呢,主要是通过 HTML 的 canvas、JavaScript 以及着色器语言 GLSL ES,也就是说 webgl 页面包含这三种语言;

WebGL 入门

WebGL 渲染流程

首先我们先说一下 webgl 程序渲染的一个整体的流程;如下图:
图

图片出自 https://coding.imooc.com/class/chapter/432.html#Anchor

首先通过 JavaScript 将坐标点数据通过顶点着色器传入到 webgl 系统,然后进行图元的装配,也就是说根据传入的点进行组装图形;组装完毕之后进行将装备好的图片变成像素的形式,也就是图形的光栅化过程。栅格化之后该片元着色器上场,对每个片元进行着色;片元着色器是对每一个像素点进行渲染。最后渲染进去到帧缓冲区存储到内存中,通过 GPU 进行渲染。

对于 canvas 元素,我这里就不详细描述,可以通过 mdn 查看对应用法。

HelloWorld 程序

首先先来一段最简单的 HelloWorld 程序:设置绘图区颜色:
代码如下:

import React, { useRef, useEffect } from 'react'


const HelloWorld = () => {
  const canvasDom = useRef<HTMLCanvasElement | null>(null)

  const main = () => {
    if (!canvasDom.current) return
    const gl = canvasDom.current.getContext('webgl')
    if (!gl) {
      console.log('Failed to get the rendering context for WebGL')
      return
    }
    // 指定清空 canavs 的颜色
    gl.clearColor(0.0, 0.0, 0.0, 1.0)

    // 清空 canvas
    gl.clear(gl.COLOR_BUFFER_BIT)
  }

  useEffect(() => {
    main()
  }, [])

  return (
    <canvas ref={canvasDom} style={{
      width: '500px',
      height: '500px'
    }}></canvas>
  )
}

export default HelloWorld

例子是基于 react 写的,其他的没关系,只需要看 main 函数即可,

程序解析

getContext()

首先是通过 getContext 函数获取绘图的上下文;这里需要注意的是 canvas 支持二三维绘图,但是它不提供绘图方法,而是由一种上下文的机制进行绘图canvas.getContext(),函数参数指定类型。有关传入的参数,可以查看该api,这里也就不展开讲述 webgl1.0 与 webgl2.0。有兴趣的可以去自行学习。

gl.clearColor()、gl.clear()

有了 webgl 绘图上下文之后,就可以用它来设置背景色,然后用背景色清空绘图区域。gl.clearColor()、gl.clear() 两个方法就是用来设置背景色以及通过设置的背景色清空绘图区域。

至于为什么要使用颜色清空背景色,因为一旦指定了颜色,颜色就会贮存在WebGL中,在下一次调用 gl.clearColor() 方法前不会改变。为了不影响下一次的使用,所以要清除颜色,gl.clear 可以传入一下几个类型:

参数名称
gl.COLOR_BUFFER_BIT颜色缓冲区
gl.DEPTH_BUFFER_BIT深度缓冲区
gl.STENCIL_BUFFER_BIT模板缓冲区

至此,最简单的 webgl 程序已经完成。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiegiser#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值