当前位置: 首页 > 文档资料 > HTML5 Canvas 实战 >

9.2 创建三角形平面

优质
小牛编辑
133浏览
2023-12-01

现在,我们的WebGL包装器已经构建好,让我们在屏幕上绘制一个简单的三角形,来创建我们的第一个WebGL应用。它将作为创建更复杂的3D模型的典型步骤的良好基础。本节,我们将介绍位置缓冲区的概念,它其实就是用来定义3D模型的位置和形状的顶点的数组。

创建三角形平面
图9-1 创建三角形平面

操作步骤

按照以下步骤使用WebGL渲染一个2D三角形:

1. 链接到glMatrix库和WebGL包装器:

<script type="text/javascript" src="glMatrix-1.0.1.min.js"> </script>
<script type="text/javascript" src="WebGL.js"> </script>

2. 定义initBuffers()函数,该函数初始化三角形的位置缓冲区:

function initBuffers(gl){
  var triangleBuffers  =  {};
  triangleBuffers.positionBuffer  = gl.createArrayBuffer([
    0,  1,  0,
    -1, -1, 0,
    1,  -1, 0
  ]);
  return triangleBuffers;
}

3. 定义stage()函数,该函数设置透视矩阵,把模型-视图矩阵设置到单位矩阵,在z轴方向将模型-视图矩阵向后平移-5个单位,把位置缓冲区发送到显卡,然后调用drawArrays()方法绘制该三角形:

function stage(gl, triangleBuffers){
  gl.clear();
  // 把视野设置为45°,把可见范围设置为0.1 到100.0单位
  gl.perspective(45,  0.1,  100.0);
  gl.identity();
  //平移模型-视图矩阵
  gl.translate(0,  0,  -5);
  gl.pushPositionBuffer(triangleBuffers);
  gl.drawArrays(triangleBuffers);
}

4. 页面加载完成后,新建一个WebGL包装器对象的实例,把着色器程序设置为“BLUE_COLOR”,初始化三角形的缓冲区,然后绘制画布:

window.onload  = function(){
  var gl  = new WebGL("myCanvas", "experimental-webgl"); 
  gl.setShaderProgram("BLUE_COLOR");
  var triangleBuffers  = initBuffers(gl); 
  stage(gl, triangleBuffers);
};

5. 在HTML文档的body部分嵌入canvas标签:

<canvas id="myCanvas" width="600" height="250"  style="border:1px solid black;">
</canvas>

工作原理

页面加载完成后,我们要做的第一件事,就是使用experimental-webgl上下文来初始化WebGL包装器对象。在本书写作之时,experimental-webgl上下文是所有支持WebGL的主流浏览器中唯一的画布上下文,这些主流浏览器包括Google Chrome,Firefox,和Safari。

接下来,我们可以把着色器程序设置为“BLUE_COLOR”,它将使用预建的GLSL程序渲染蓝色的顶点和片段。一旦着色器程序设置完成,我们需要初始化我们的缓冲区。缓冲区是顶点的数组,顶点用来定义3D模型的位置和形状。本节,我们仅仅使用一个位置缓冲区,来定义三角形的顶点位置。在未来的几节中,我们将介绍其它缓冲区类型,包括索引缓冲区、纹理缓冲区、法线缓冲区。本节的位置缓冲区包含9个元素,它们代表3个顶点(每个顶点都有一个x,y,z分量)。

一旦三角形的缓冲区初始化完成,我们就可以绘制画布了。stage()函数先清除画布,再设置透视矩阵。我们的WebGL包装器对象的perspective()方法接受3个参数,一个视角参数,一个最小可见距离参数,一个最大可见距离参数。本节,我们把最小可见距离设置为0.1个单位,把最大可见距离设置为100个单位。任何比0.1个单位还近的对象将不可见,任何比100个单位还远的对象也不可见。如果我们的画布上包含很多复杂模型并遍布整个空间,因为要立刻在屏幕上渲染太多的对象,较大的最大可见距离可能导致潜在的性能问题。

接下来,我们可以使用identity()函数把模型-视图矩阵设置到单位矩阵,再把模型-视图矩阵平移到(0, 0, -5)。这就是说,我们只是简单地把模型-视图矩阵,在z轴方向上向远离用户的方向,平移5个单位。

最后,我们可以使用pushPositionBuffer()方法,把位置缓冲区发送到显卡,然后调用drawArrays()方法绘制该三角形。