天天看点

用计算机图形学编程实现茶壶真实感效果,计算机图形学大作业.pdf

计算机图形学 大作业

5090379126

虞文豪

题目:通过光照及纹理映射,实现高度真实感青花瓷材质的

茶壶向茶杯倒水动画特效。

一. 概述

之前的作业用使用SPH 方法做了一个水流的模拟程序,这次作业在上次

作业的基础上增加了渲染的部分,对SPH 的一些参数以及碰撞检测进行了一

些小的调整。

这次大作业中主完成了的功能有:

1. 建立背景平面

2. 实现茶壶拿起的动画

3. 水蒸汽效果

4. 青花瓷材质

5. 茶壶与茶杯的环境映射及环境映射与纹理叠加

6. 水流的半透明与折射效果

二. 实现

1. 建立背景平面

在第一次作业中我使用3DMAX 做了一个简易的小房间,这次作业中为小房间内的东西

添加了纹理贴图使得房间看起来更加美观与真实。

背景房间:

2. 实现茶壶拿起的动画

茶壶动画的实现通过两个数组来完成,一个数组表明一系列的茶壶位置变化向量,另一

个数组表明一系列的茶壶旋转弧度,这里的旋转是沿着z 轴进行的,因为茶壶在被拿起过程

中可以认为另两个方向是不转的。

倒水中的茶壶:

3. 水蒸汽效果

这次作业中实现了一个粒子系统来模拟水蒸汽的效果。粒子系统中的每个粒子具有生命、

速度、位置、旋转、大小等属性。

粒子的生命每帧减少。粒子的速度在X 与Z 方向递减,在Y 方向有少量递增,这样保证

了粒子总体是往上移动的,粒子的初始速度随机。每次更新时,粒子会获得一个随机的少量

旋转来增加一些动态。每个粒子初始大小随机,随着时间流逝粒子会先达到最大的大小,然

后开始缩小,在粒子死亡时大小接近于0 。

粒子的渲染使用了一个小立方体,然后通过OPENGL 的blend 以及depthmask 来创造粒

子密的地方颜色浓,粒子稀的地方颜色淡的效果。

蒸汽效果:

4. 青花瓷材质

青花瓷材质的制作是从网上找了一张青花瓷的贴图,然后把茶壶与茶杯的模型放到

3DMAX 中,再用uvw 展开调整贴图的位置使得模型更像一个青花瓷制品。

青花瓷材质:

5. 茶壶与茶杯的环境映射及环境映射与纹理叠加

茶壶与茶杯的环境映射通过使用OPENGL 的CUBE MAP 实现,由于我的场景不是现有的

六面场景而是一个房间模型,因此我通过手动设置以及截图,把场景的六个方向分别进行了

截图构成了CUBE MAP 的六个面。

在绘制茶壶与茶杯前在OPENGL 的纹理矩阵中对CUBE MAP 纹理进行了旋转以配合当前

的视角。

环境映射与纹理的叠加使用了ALPHA 和BLEND 来实现。在读取CUBE MAP 的六张图片

时,通过手动修改图片数据,将图片从原本的24 位 RGB 格式改为32 位 RGBA 格式,并把

Alphs 位赋为90 。然后在同样的位置,画一个比之前稍大一点的茶壶(茶杯) 。这里的做法是

把所有节点都向法向量移动一点点。设置适当的blend 函数。这样就能把环境映射和茶壶(杯)

的纹理很好地结合起来。

环境映射:

结合后效果:

6. 水流的半透明与折射效果

水流的渲染是通过render to texture 以及cg,即c for graphics 这样一个gpu 编程语言来

做的。它本来自带了一个 refract 函数用以计算折射,但是它更适合六面背景中的一滩水,

而不是装在不透明容器中的水,而且由于我的cube map 颜色比较杂,试了这个方法以后发

现效果很不好,因此这里参考

/presentations/2010/gdc/Direct3D_Effects.pdf 进行了实

现,但是由于实现过程中遇到不少问题,因此只是参考了其中的几个步骤,而不是完全实现

了文章,因此效果也有差异。

水流渲染中用到了5 个纹理缓存,分别用来储存:背景、水流mask、水流的法向图以

及水流的厚度图,还用到了3 组cg 写的shader 进行处理。