欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)

程序员文章站 2022-05-23 14:02:13
...

今日目标:编写世界上最短的WebGL程序,HelloCanvas。

这个程序的功能就是使用背景色清空了 <【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)canvas> 标签的绘图区。
今天的成果:
【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)


开始学习!


HTML文件

先来看一下HelloCanvas.html

HelloCanvas.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Clear canvas</title>
</head>

<body onload="main()">
    <canvas id="webgl" width="400" height="400">
        Please use a browser that supports "canvas"
    </canvas>

    <script src="../lib/webgl-utils.js"></script>
    <script src="../lib/webgl-debug.js"></script>
    <script src="../lib/cuon-utils.js"></script>
    <script src="HelloCanvas.js"></script>
</body>
</html>

文件的结构很简单:首先使用 <【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)canvas> 元素定义绘图区域,然后引入HelloCanvas.js文件。除此之外还引入了一些其他文件(就是上一篇文章我说的要去下载的)。

【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)


HelloCanvas.js

好啦,其实真正使用WebGL来绘制三维图形是在 HelloCanvas.js 这个文件里,看之前先回顾一下上一篇提到的绘制二维图形的三个步骤:

  • 获取 <【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)canvas> 元素
  • 获取绘图上下文
  • 开始绘图

    HelloCanvas.js

function main() {
    //获取canvas元素
    var canvas = document.getElementById("webgl");
    if(!canvas){
        console.log("Failed to retrieve the <canvas> element");
        return;
    }

    //获取WebGL绘图上下文
    var gl = getWebGLContext(canvas);
    if(!gl){
        console.log("Failed to get the rendering context for WebGL");
        return;
    }

    //指定清空<canvas>颜色
    gl.clearColor(0.0, 0.0, 0.0, 1.0);

    //清空<canvas>
    gl.clear(gl.COLOR_BUFFER_BIT);
}

本例子中,main()函数的执行流,包含了以下四个步骤,我们将分别解析:

  1. 获取 <【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)canvas> 元素(不说了,和上一篇一样,传id)
  2. 获取WebGL绘图上下文
  3. 设置背景色
  4. 清空 <【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)canvas>

为WebGL获取绘图上下文

 var gl = getWebGLContext(canvas);

通常来说,应该使用 canvas.getContex() 函数来获取绘图上下文,但在获取WebGL绘图上下文时,canvas.getContex() 函数接受的参数,在不同浏览器种不同,所以这里写了一个函数 getWebGLContext() 来隐藏不同浏览器之间的差异。

而这个函数就在要下的那几个文件里,在前面html文件里引进来的。
下面是该函数的一些规范
【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)

设置 <【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)canvas>颜色

gl.clearColor(0.0, 0.0, 0.0, 1.0);

在上一篇笔记中,我们在绘制矩形之前就制定了绘图颜色。在WebGL中,与之类似,清空绘图区之前你也得指定背景颜色,同样是以 RAGB 格式设置背景色,但不同的是取值范围。
在上一篇二维图形程序中,颜色分量值是在0到255之间。凡是,由于 WebGL 是继承自 OpenGL 的,所以它遵循传统的 OpenGL 颜色分量的取值范围,是从 0.0 到 1.0。RGB 的值越高,颜色越亮。透明度还是相同的取值范围。

一旦指定了背景色后,背景色就会贮存在WebGL系统(WebGL System)中,在下一次调用 gl.clearColor() 前不会改变。

清空 <【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)canvas>

gl.clear(gl.COLOR_BUFFER_BIT);

最后调用这个函数,用之前指定的背景色清空(用背景色填充,擦除已经绘制的内容)绘图区域。

注意,函数的参数是 gl.COLOR_BUFFER_BIT ,而不是表示绘图区域的<【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)canvas>。这是因为 WebGL 中的 gl.clear() 方法实际上继承自 OpenGL ,它基于多基本缓冲区模型。清空绘图区域,实际上是在清空颜色缓冲区(color buffer),传递参数 gl.COLOR_BUFFER_BIT 是在告诉 WebGL 清空颜色缓存区,比如深度缓冲区和模板缓存区(后面介绍,有个印象就行)。

【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)

如果没有指定背景色,那么使用的默认值如下图:

【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)


运行下html文件就可以看到这样的啦:
【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)

更改颜色的RGB值,还可以更改颜色
【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)

今天就到这啦 ,打完收工!

相关标签: webgl 图形学