六、分形,高度图,粒子系统

这一章介绍了我们可以用数学达到的各种效果。我们将涉及的主题包括:

  • 直接用 GPU 绘画
  • 分形和 Mandelbrot 集简介
  • 高度图和地形生成
  • 用鼠标旋转摄像机
  • 粒子系统

因为我长久以来一直迷恋于数学和它所产生的美丽意象的强烈交集,所以这一章对我来说写起来特别有趣。即使你不是特别喜欢数学,你也可以跳过大部分细节/技术解释,直接用代码进行实验。我确信这里展示的例子和技术会让你感兴趣,并且可以被修改用于任何 WebGL 程序。

用 GPU 直接绘画

在讨论分形图像和 Mandelbrot 集合之前,我们将展示如何用纯粹包含在着色器程序中的逻辑来绘制图像。我们的 WebGL 应用将使用的唯一几何图形是来自五个顶点的四个三角形,它们将形成一个平面。然后,我们将使用图形处理单元(GPU) 的片段着色器,以编程方式设置平面上每个单独的像素颜色。不会对视图进行任何操作。方形平面的设置如清单 6-1 所示。

清单 6-1功能在 xy 平面上创建一个由两个三角形组成的正方形

函数 createSquare(size){

size = (typeof size !== 'undefined') ?大小 : 2.0;

var vertexPositionData = [

0.0, 0.0, 0.0,

-尺寸/2.0,-尺寸/2.0,0.0,

尺寸/2.0,-尺寸/2.0,0.0,

尺码/2.0,尺码/2.0,0.0,

-尺寸/2.0,尺寸/2.0,0.0,

];

凡指数数据= [0,1,2,2,3,3,4,4,1];

triangle deployment buffer = GL . create buffer();

gl.bindBuffer(gl)。ARRAY_BUFFER,三角形分布缓冲区:

gl.bufferData(gl。ARRAY_BUFFER,new float 32 ARRAY(vertexPositionData),

gl。STATIC _ DRAW);

三角形分布缓冲区。item size = 3;

triangle deployment buffer . num items = vertexposition data . length/3:

vertxinindexbuffer = GL . create buffer();

bindBuffer(gl。ELEMENT_ARRAY_BUFFER,vertexindex BUFFER);

gl.bufferData(gl。ELEMENT_ARRAY_BUFFER,new Uint16Array(indexData),gl。STREAM _ DRAW);

vertexIndexBuffer.itemSize = 3;

vertxinindexbuffer . num items = index ATA . length:

}

清单 6-1 中平面的默认尺寸是 2.0 x 2.0。

我们的顶点着色器获取 x,y 输入坐标,并将它们传递给片段着色器。z 值固定为 0.0。