引言
图形学,全称为计算机图形学,是一门研究如何利用计算机表示、生成、处理和显示图形的学科。它的应用极为广泛,涵盖电影、游戏、计算机仿真、CAD/CAM/CAE(计算机辅助设计、制造和工程)、建筑、可视化等诸多领域。在当下,无论是我们日常玩的精美游戏,还是观看的震撼电影特效,亦或是工业产品的设计研发,都离不开图形学技术的支持。接下来,让我们一同追溯图形学的发展历程。
早期探索(20 世纪 50 年代 - 60 年代)
萌芽阶段(20 世纪 50 年代)
在 20 世纪 50 年代初期,1950 年,第一台图形显示器作为美国麻省理工学院(MIT)旋风 I 号计算机的附件诞生,其主要部件是阴极射线管(CRT),当时仅能显示一些简单图形,这标志着计算机图形学硬件发展迈出了第一步。1958 年,美国 Calcomp 公司将联机的数字记录仪发展成滚筒式绘图仪,GerBer 公司把数控机床发展成平板式绘图仪,早期图形输出设备得到进一步发展。50 年代末期,MIT 的林肯实验室在 “旋风” 计算机上开发美军的 SAGE 空中防御体系,操作者能通过光笔在屏幕上指定目标,预示着交互式计算机图形学的诞生,这一时期的图形学主要应用于军事领域,处于 “被动式” 图形学阶段,计算机图形学尚在孕育之中。
奠基时刻(20 世纪 60 年代)
1962 年,MIT 林肯实验室的 Ivan E.Sutherland 发表了题为 “Sketchpad:一个人机交互通信的图形系统” 的博士论文,首次使用 “计算机图形学(Computer Graphics)” 这一术语,证明了交互计算机图形学的可行性与实用性,确定了计算机图形学作为独立科学分支的地位,Ivan E.Sutherland 也因此被尊称为 “图形学之父”。他还在 1966 年和学生开发出被认为是头戴式显示器(HMD)以及 VR 雏形的系统。1963 年,图形学开始涉足电影领域,如《力 - 物质和运动》。同年,Sketchpad 绘图应用诞生,开创交互式电脑绘图先河。1961 年,Steve Russell 开发出游戏 Spacewar。1962 年,雷诺汽车公司的 Pierre Bezier 提出 Bezier 曲线曲面理论,成为计算机辅助几何设计(CAGD)的先驱,雪铁龙公司的 de Casteljau 也做了类似工作,Bezier 曲线曲面理论中关键的 de Castelijau 算法由他发明。1964 年,MIT 教授 Steven A. Coons 提出超限插值思想,通过插值四条任意边界曲线构造曲面,并于 1958 年提出 “CAD” 概念。这一时期为计算机图形学奠定了坚实基础,诸多理论和应用雏形相继出现。
发展初期(20 世纪 70 年代 - 80 年代)
技术发展(20 世纪 70 年代)
70 年代是计算机图形学发展的重要时期。随着金属氧化物半导体(MOS)和超大规模集成电路(LSI)出现,图形学发展加速,动态随机存取存储器(DRAM)的诞生使数据存储能力飞跃。光栅显示器的产生促使 60 年代萌芽的光栅图形学算法迅速发展,区域填充、裁剪、消隐等基本图形概念及相应算法纷纷诞生,图形学进入第一个兴盛期。1974 年,Edwin Catmull 提出材质贴图(texture mapping),John Warnock 创造 Adobe system,开始改变出版业。1977 年,3D core Graphics System 成为最早的图形学标准。1973 年,Bui Tuong Phong 提出 Phong 着色法。这一时期,图形学在硬件和算法上都取得显著进展,逐步走向实用化。
普及与商业化(20 世纪 80 年代)
超大规模集成电路(VLSI)的发展迎来 PC 时代,GPU 的出现推动图形学变革,如 NEC uPD7220 使分辨率提升至 1024*1024,Evan & Sutherland 开发出 3D 位图 GPU。1984 年,芯片 ARTC HD63484 助力 4k 显示器出现。图形工作站如 Orca 系列诞生,PC 电脑开始用于设计,如 Commodore Amiga、Macintosh,多媒体技术和图形用户界面(GUI)普及。计算机成像(CGI)电影受到欢迎,如《星球大战》《少年福尔摩斯》。这一时期,图形学从专业领域走向大众,在多个行业得到广泛应用,实现了普及与商业化。
蓬勃发展(20 世纪 90 年代 - 21 世纪初)
进入 3D 时代(20 世纪 90 年代)
1992 年,Virtual Racing 开启新的游戏体验。1995 年,Edwin Catmull 所在的 Pixar 推出《玩具总动员》,并自研可编程着色器。1993 - 1996 年,世嘉推出 Sega Model2、Sega Model3 街机。1993 年,《毁灭战士》《雷神之锤》《超级马里奥 64》等游戏涌现。1996 年,Krishnamurthy & Levoy 提出法线贴图(Normal Mapping),提升低精度模型显示效果。1999 年,Nvidia 推出 Geforce 256,1995 年 DirectX1.0 发布,1997 年 OpenGL1.1 发布。这一时期,3D 图形技术在游戏和动画领域大放异彩,图形硬件和软件接口不断更新升级。
广泛应用(21 世纪初)
21 世纪初,Nvidia & AMD 的显卡普及,着色器(Shaders)成为显卡渲染标准,游戏和电影基本都运用计算机生成图像(CGI),如《最终幻想》《星际争霸》《反恐精英》《魔兽争霸》等。这一阶段,图形学技术在娱乐产业中深度渗透,成为不可或缺的关键技术,推动了数字内容产业的繁荣发展。
现代发展(2010 年代 - 至今)
技术革新(2010 年代)
进入 2010 年代,显卡渲染工序愈发复杂,Shader language 普及,如 GLSL。基于物理渲染技术兴起,模拟环境遮蔽光、次表面散射光等,使渲染效果更接近真实物理特性,真实感渲染流行,如《午夜凶铃》中恐怖谷效果的呈现。计算机视觉(人脸识别、自动驾驶)与人工智能和图形学紧密结合。VR(Virtual Reality)技术广泛应用于网络直播、科研教学、安全、娱乐、游戏等多个领域,改变人们的交互和体验方式。
当下与未来
如今,图形学持续发展,在元宇宙概念兴起的背景下,图形学技术为构建虚拟世界提供关键支持,在虚拟社交、虚拟办公、虚拟教育等场景发挥重要作用。未来,随着硬件性能提升、算法优化以及与其他学科融合,图形学有望在更多领域取得突破,如在医疗领域实现更精准的医学成像和手术模拟,在建筑领域实现更逼真的虚拟建筑漫游和设计评估,在工业制造领域实现更高效的产品设计和虚拟装配等。我们可以期待图形学为我们的生活和各个行业带来更多创新与变革。
图形学相关代码示例(以 JavaScript 为例)
简单图形绘制
在 HTML5 的 Canvas 中,可以使用 JavaScript 绘制简单图形。例如绘制一个矩形:
<canvas id="myCanvas" width="200" height="100"></canvas>
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
ctx.fillStyle = 'blue';
ctx.fillRect(50, 25, 100, 50);
</script>
上述代码中,首先获取 Canvas 元素,然后获取绘图上下文ctx,通过设置填充颜色为蓝色,使用fillRect方法绘制一个左上角坐标为 (50, 25),宽 100,高 50 的蓝色矩形。
3D 图形基础(基于 Three.js 库)
Three.js 是一个用于在网页上创建和显示 3D 图形的 JavaScript 库。下面是一个简单的使用 Three.js 创建一个 3D 立方体并显示的示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF - 8">
<title>Three.js Cube</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
</head>
<body>
<script>
// 创建场景
const scene = new THREE.Scene();
// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;
// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// 创建几何形状(立方体)
const geometry = new THREE.BoxGeometry(1, 1, 1);
// 创建材质
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
// 创建网格(将几何形状和材质组合)
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
</script>
</body>
</html>
这段代码首先引入 Three.js 库,接着创建场景、相机和渲染器。通过BoxGeometry创建一个立方体的几何形状,用MeshBasicMaterial定义材质,将二者组合成一个网格对象cube并添加到场景中。最后通过animate函数实现立方体的旋转动画并进行渲染,在网页上呈现出一个绿色且不断旋转的 3D 立方体。通过这些简单的代码示例,可以初步了解如何利用 JavaScript 进行图形绘制和 3D 图形展示,这也是图形学在前端开发中的基础应用体现。随着对图形学深入学习,可以实现更复杂、精美的图形效果和交互功能。