万 琳, 吕泽华
(华中科技大学 软件学院,湖北 武汉 430074)
2017年,教育部提出进行“新工科”建设,对我国高等工程教育的内涵、建设与发展的路径进行了探讨与规划[1~3]。作为一门面向应用的交叉学科,计算机图形学应用在计算机辅助设计与制造、科学计算可视化、虚拟现实/增强现实、游戏与电影特效等领域,对学生的数学基础、计算思维、计算机系统结构理解和程序设计能力都有一定的要求[4~6]。在新工科的背景下,“计算机图形学”课程的教学只有做到理论和实践密切联系、经典理论和创新思维有效融合才能培养出工业界需要的具备实践能力和创新精神的高素质复合型新工科人才。
计算机图形学经历了五十多年的发展,在理论方面,从光栅化图形学到真实感图形学[7],形成了十分丰富、完整的理论体系,学生学习周期长;在工业界的应用方面,一般会采用先进的编程体系、基于图形引擎和GPU芯片来实现。和国外相比,国内图形学的教学比较传统,主要存在以下几个问题:
1)教学内容的构建不完全满足工业界的需求
从理论教学上看,“计算机图形学”的教学内容包括光栅图形学和真实感图形学两个主要部分。光栅图形学主要包括基本图元的生成和属性处理算法、二维/三维的变换与观察计算等;真实感图形学则包括光照、纹理、阴影的计算。要想达到工业界影片、游戏的效果,这两个部分密不可分。但是,目前的理论教学中容易出现将两者割裂的问题,缺少基于图形绘制本质的融合。
从实验教学看,“计算机图形学”的实验教学中,部分教师开始训练学生基于工业界认可的图形标准如OpenGL和DirectX等。但是,部分实验教学缺少对着色器和可编程渲染管线的引入。而且,在实验中一般通过调用GPU支持的图形API(如OpenGL和DirectX的图形API)完成图形绘制,把GPU当作一个“黑盒子”并不对其内部结构进行探究。
2)教学过程的组织不完全符合学生的认知规律
在图形学应用飞速发展的今天,学生对图形学的认知起点并非在课堂上,而是在生活中。手机上应用的图形用户界面、电影、游戏、虚拟现实都让学生领略到图形学的魅力[8]。但是走进课堂,学生们却发现自己只能绘制直线、立方体等简单图形。其实,光栅化和真实感图形学的经典理论知识、软光栅编程的方法都是图形学这座大厦的基石。但是,目前的教学过程不符合由外而内、由抽象到具体的认知规律。通过搭建先进的编程框架、实现与工业界相通的图形应用让学生了解图形学,激发学生的学习兴趣,进而引导学生揭开图形学的神秘面纱,探寻背后的奥秘——这一过程将更符合学生的认知规律。
在新工科的背景下,为培养学生掌握“计算机图形学”的理论知识和实践能力,不仅需要面向工业界的实际应用需求,也需要回归图形学的本质。基于图形渲染流水线,参照工业界实际编程框架,我们对“计算机图形学”的教学内容进行了构建。
根据电气与电子工程师协会IEEE(Institute of Electrical and Electronics Engineers)的定义,计算机图形学是研究怎样利用计算机来显示、生成和处理图形的原理、方法和技术的一门学科。图形学的输入是对图形的数学描述,而输出则是显示设备上的像素点阵,本质是一个渲染的过程。在图形标准、流水线的概念、钩函数机制、GPU计算引入之后,这一渲染的过程表现为一个可编程渲染流水线。
对于给定的三维物体,显示、生成和处理图形的过程转换为在设置虚拟相机、光源、照明模式以及纹理等诸多条件下生成像素点阵的过程。这个过程包括了应用阶段、几何阶段和光栅化阶段三个概念阶段,体现了图形编程的最新发展,也回归了图形“从数学定义到像素点阵”的本质。这三个阶段有机地融合了光栅化图形学和真实感图形学的理论知识:在应用阶段,顶点信息来源于几何造型、图元生成算法;在几何阶段,整个变换的过程都离不开以齐次坐标为基础的二维/三维变换和观察计算、裁剪算法;在光栅化阶段,光照、纹理、阴影、深度测试、颜色混合等理论知识十分重要。因此,按照可编程渲染流水线的三个概念阶段组织理论教学内容可以将经典理论和图形最新发展有机地融合在符合现代图形编程的框架之中。
面向工业界实际的应用,我们对实验教学进行了改革:
(1)采用可编程渲染流水线:在图形编程的发展历程上,图形标准的成熟、流水线概念的形成以及钩函数机制的出现都是里程碑——图形标准使得图形编程与硬件无关,固定流水线进一步解放了程序员,钩函数则突破了固定流水线的限制。目前工业界的图形编程普遍采用可编程渲染流水线,为了培养能胜任工业界图形开发工作的图形编程人才,我们的实验教学将以可编程渲染流水线为基础。
(2)结合CPU和GPU的计算能力:早期的图形编程全部由CPU完成,然而随着GPU的出现和飞速发展,图形编程应该充分利用CPU和GPU的计算能力。由于结构上的区别,CPU和GPU的计算能力有很大差异,CPU可以方便地实现数据之间存在相关性的算法,而GPU则可以对彼此间无关的大量密集型数据进行并行计算。比如,以图形计算为例,CPU可以方便地实现射线与不规则物体的求交运算,而GPU则擅长用矩阵运算实现几何阶段图元大量顶点的坐标系变换。训练学生针对不同的图形应用结合CPU和GPU的计算能力设计算法,不仅可以提高学生的图形编程能力,还可以培养学生的计算思维和对计算机系统结构的理解力。
(3)基于着色器Shader编程:作为工业界主要的图形标准之一,OpenGL得到了所有GPU硬件厂商的支持。OpenGL提供了大量的图形应用程序接口API(Application Programming Interface),而其着色器语言GLSL(OpenGL Shading Language)则是一种类C的编程语言,方便程序员编写进行矩阵运算、纹理映射等图形处理的着色器。学生可以通过写Shader,让GPU执行渲染命令,实现基于GPU硬件的各种各样灵活的图形计算。学习Shader可以帮助学生更好地了解图形学的算法和GPU的工作逻辑。在实验教学中,可以设计循序渐进的练习。以“片元着色器”为例,可以先给出示例代码,通过让同学们修改其中参数观察结果的变化,之后则可以通过程序填空、程序段扩展等逐步增加图形编程难度,对学生进行进阶训练。 基于以上考虑,在实验教学中我们采用可编程渲染流水线,结合CPU和GPU的计算能力,基于OpenGL图形标准搭建了先进实用的编程框架。如图1所示,这一框架和工业界主流图形编程框架完全一致。应用层包括图形应用和图形引擎,将渲染命令发给支撑层;支撑层包括图形标准和显卡驱动,将渲染命令翻译成硬件可以理解的指令发给硬件层;硬件层则由CPU和GPU配合完成图形计算。
其中,“教学实验”的设置在应用层,不仅可以基于图形引擎开发面向用户的图形应用,也可以开发面向开发人员的图形引擎。这样的定位可以帮助我们培养具备实践能力和创新精神的高素质人才。
在实验内容上,针对流水线的三个阶段规划了不同的实验内容,如图2所示。
图1 图形编程框架
图2 三个阶段的实验内容规划
应用阶段的环境搭建实验主要是让学生做好实验准备;应用程序阶段针对图元生成设置了三角形绘制,针对造型技术的规则造型部分设置了球的绘制、模型导入实验,非规则造型部分设置了粒子系统实验;
几何阶段,设置了着色器实验帮助学生学习着色器编程,摄像机和天空盒则可以让学生们学习到如何实现观察变换、模型变换、投影变换、屏幕映射以及裁剪;
光栅化阶段则需要让学生对光照、纹理(颜色纹理属于平面纹理,法线贴图可以实现视觉效果凹凸不平的几何纹理)、阴影等真实感图形学知识进行实践,而透明物体这一实验可以让学生深入学习深度测试、颜色混合等重要内容。在学习了三个阶段之后,通过“实验14:延迟渲染”可以让学生对正向渲染和几种不同方式的延迟渲染进行对比,体会到可编程渲染流水线的灵活性,学习到如何优化渲染过程以提高性能。
以2节构建的理论和实验教学内容为基础,我们需要对教学过程进行合理的组织,引导学生由外而内、由浅入深、从抽象到具体地进行学习。具体包括以下组织方法:
1)以渲染流水线为主线分层、分块组织教学内容
在学习的过程中,我们的主线仍然是渲染流水线的三个阶段,但是每个阶段又可以分层和分块,分层对应到不同的深度,分块则对应到不同的知识点。具体的问题和实验则可能在不同的层次上对应到不同的知识点,如图3所示。分层的方式可以实现知识体系的纵向深化,使学生循序渐进掌握计算机图形学一般应用问题的解决方法,并巩固所学习的基础理论知识;分块的方式可以保证知识体系的广度,帮助学生构建完整的知识体系。
图3 以渲染流水线为主线分层、分块组织内容
2)按照“讲解-演示-体验-探索”构建教学资源
为增强教学过程的完整性、趣味性和进阶特性,我们构建了从知识点讲解、演示型案例、体验型案例到实验探索的教学资源体系并不断对其进行优化。如图4所示,其中:
图4 按照“讲解-演示-体验-探索”构建教学资源
知识点讲解:除传统的讲义和PPT,还包括知识点讲解的视频资源。2018年,课程组完成了“计算机图形学慕课”建设,按照知识体系精心拍摄了70个左右,共计约700分钟的教学视频。目前该课程已经在中国大学慕课上线三轮,获得了一定的好评。
演示型案例:生动形象的演示型案例可以帮助学生直观地理解图形学的知识点,如图5所示的通过课程自设卡通形象“小图”的顶点表示、三角网格等变化可以生动地说明图形学渲染流水线的处理过程;
图5 演示型案例:助学——渲染流水线
体验型案例:体验型案例可以让学生参与到交互的过程中,比如可以进行参数设置、程序填空等,通过观察设置不同参数、填写不同程序段进行图形处理时的不同结果学习理论知识,培养实践能力。这种方式对于在知识体系尚未构建完毕时,引导学生观察局部变化对整体图形渲染过程的影响十分有帮助。
进阶实验:设置了从在一个窗口中绘制多边形到粒子系统、延迟渲染的多个进阶实验,逐步提高学生的图形编程能力。实验项目的安排除了基本理论的验证和基本算法的实现外,还包含各种理论和算法有机结合而进行的综合设计,以利于培养学生自主学习、独立思考、分析解决问题的能力。
3)遵循“现象-解释-经验-知识”的学习周期
科尔伯等人将学习过程视为一个既主动又被动、既具体又抽象的四级学习周期,具体包括解释已发生的事情、解释为什么会发生这样的事情、如何从经验中改进和学习、获得经验这四个部分。科尔伯认为学习周期是一个持续往复的过程,比如各种概念在实践中要不断地进行检验,并做适当地修整。在“计算机图形学”的教学中,这个学习周期可以理解为:让学生看到现象尝试解释这是什么现象,进而解释发生这些现象的原因,从而获得经验,最后将获得的经验转化为知识。因此,我们可以从工业界图形应用入手,让学生描述现象,通过学习理论知识解释现象,之后在实践中验证并获得经验,最后转化为知识。这一过程既可以激发学生的学习兴趣,也可以帮助学生通过理论学习和实践检验的持续往复获得知识,符合新工科人才培养的要求。
针对传统“计算机图形学”教学内容不能满足工业界的需求和教学过程不符合学生认知规律的问题,本文提出“计算机图形学”教学内容的构建和教学过程的组织方案。在教学内容构建上,结合基于渲染流水线的理论教学和面向工业界的实验教学做到理论和实践密切联系、经典理论和创新思维有效融合;在教学过程组织上以渲染流水线为主线分层、分块组织内容,按照“讲解-演示-体验-探索”构建教学资源,做到遵循“现象-解释-经验-知识”的学习周期组织教学过程。这种教学内容和过程组织,既是对理论和实践、经典和创新的进一步整合、凝练,也是对学生理论学习和动手实践模式的新探索,是一种切实可行并行之有效的教学改革思路。