Fundamentals of Computer Graphics(4th Ed)--Introduction(计算机图形学翻译级笔记)

转载请注明出处
欢迎留言、讨论、指正
本文未注明出处图片均来自 个人 或 Fundamentals of Computer Graphics(4th Ed)

计算机图形学–>使用计算机作图改图
涉及:特殊硬件、文件格式、图形学API等
本书主要介绍合成图像和三位物体或场景的基本算法和数学知识

图形学内容(Graphics Area)
多数从业者认同以下核心领域
建模:将形状和几何特征以某种方式数值化存储于计算机中
           eg:咖啡杯=一个3D点集以某种插值规则连接+光线作用
渲染:继承自艺术领域,负责将3D模型转换输出为2D视觉图片
动画:通过建模和渲染辅以时间关键帧,专注于由图像序列产生运动错觉的技术
以下相关领域不一定是核心,但本书会接触到:
用户交互,虚拟现实,信息可视化,图像处理,3D扫描

应用领域(Major Application)
游戏动漫,视觉特效,计算机辅助设计CAD/制造CAM,仿真(尤其式安全领域),医疗图像(CT)

图形学API
一组相关操作的标准函数集合
一个图形学程序=用户界面API+视觉输出API+…
有两种主要范式:
1.整合型的,以JAVA为例,有完整的可移植的标准工具包,视为语言的一部分被充分支持
2.语言依赖型,如OpenGL、Direct3D,作为软件库的一部分,系统间不一定兼容,使用移植库
多数图形调用相近,本书侧重概念原理

管线(Graphic Pipeline)
如今的桌面电脑都拥有强大的3D管线,一种将3D基元(点坐标或者线段)处理成图像的特殊软/硬件子系统,通常针对共顶点的三角形网格进行了优化,最基本的操作便是将3D顶点转换到2D视觉图中相应坐标上同时考虑遮挡(现在多采用Z-buffer这种暴力的方式处理遮挡)。

管道使用四维坐标,即几何三维+透视同质坐标(fourth homogeneous coordinate that helps with perspective viewing),4D-matrix + 4D vector,可以完成几乎全部的几何操作。4D坐标运算是计算机科学中最微妙(subtle和beatiful)的结构之一,也是学习过程中最大的挑战。

因为交互直接影响用户体验,运算速度多数时候比图像质量更重要,所以最少化建模所需的三角形很有必要。远"少"近"多",因此使细节可变(varying level of detail,LOD)很重要。

数学基础(Numerical Issues)
现代计算机都统一在IEEE floating-point standard 的标准之下,极大的方便了programmer:

± ∞ \pm\infty ± 0 0 = \frac{0}{0}= 00=NaN(Not a Number), a ± ∞ = ± 0 \frac{a}{\pm\infty}=\pm0 ±a=±0
+ ∞ + ∞ = N a N \frac{+\infty}{+\infty}=NaN ++=NaN ∞ 0 = ∞ \frac{\infty}{0}=\infty 0= ∞ − ∞ = N a N \infty-\infty=NaN =NaN ± a + 0 = ± ∞ \frac{\pm a}{+0}=\pm\infty +0±a=±

例如求电阻或透镜焦点,可以避免 “if(b ==0||c ==0)” 检测,直接得到 “a=0”
a = 1 1 b + 1 c a=\frac{1}{\frac{1}{b}+\frac{1}{c}} a=b1+c11
又或者a=f(x)= ∞ \infty or NaN,boolean运算将得到: ∞ > 0 \infty>0 >0判断为true,NaN判断为false;

a=f(x);
if(a>0)
   do something;

效率
因为内存速度远慢于CPU,programmer应该更多的关注内存(memory)的访问模式而不是减少操作次数(operation counts)。这个问题只能通过有限连贯的内存访问进行优化
谨记:
1.Write the code in the most straightforward way possible. Compute intermediate results as needed on the fly rather than storing them.(形式简洁)

2.Compile in optimized mode.(???)

3.Use whatever profiling tools exist to find critical bottlenecks.(找瓶颈)

4.Examine data structures to look for ways to improve locality. If possible, make data unit sizes match the cache/page size on the target architecture.(数据结构趋向局部性,一"页"知秋)

5.If profiling reveals bottlenecks in numeric computations, examine the assembly code generated by the compiler for missed efficiencies. Rewrite source code to solve any problems you find.(编译层面找瓶颈–>重构)

多数优化只会使代码更难读懂而没有效果
注意现代计算机float不一定比int慢,任何优化都需要结合机器去实践

设计编写图形程序

1.设计类
一个好的类或例程是关键,KISS(keep it simpe and stupid)原则

一些基本的类操作与说明
vector2形如(x,y),包括+,-, ⋅ \cdot ,×,*,/
vector3形如(x,y,z),似vector2
hvector见第七章
rgb存储RGB三分量
transform4×4矩阵,留有location、direction、normal vecto的接口
imageRGB像素的2D数组
其他eg:intervals,orthonormal base、coordinate frames

2.float与double

floatdouble
为提高效率应当尽可能少的访问内存或访问连续区间计算精度
优先考虑,适用于色彩计算,数据存储用适用于几何计算,数据计算

单精度
双精度
n u m = . . . + 2 3 + 2 2 + 2 1 + 2 0 + 2 − 1 + 2 − 2 + 2 − 3 + . . . num=...+2^3+2^2+2^1+2^0+2^{-1}+2^{-2}+2^{-3}+... num=...+23+22+21+20+21+22+23+...
故二进制与十进制转换基于 × 2 \times2 ×2 ÷ 2 \div2 ÷2进行

3.Debugging
越老道的programmer使用的debugger越高级
概念性的错误往往耽误最多的时间,因为难以察觉
Debug的正确姿势:

科学方法
用图像试错–>猜想错误的原因–>验证
eg:多数人编写光线追踪(ray-tracing)时会遇到(随机暗点的)“阴影痤疮”问题,传统调试方法根本无效,我们需要意识到,这是"影线"搞的鬼,“影线"碰撞在被遮蔽的物体上。我们可以看到暗点的颜色是背景的颜色,因此我们缺的是直射光,暗点物体被误判成"被遮挡”。为了验证假设,我们关掉阴影检测,测试结果证明阴影检测错误。这就是利用的错误的思想。

错误图像出
跳过猜测部分以后的计算,直接将猜测错误的数值放入图像数组输出,颜色rgb即代表(x,y,z),注意越界或溢出检测。

Debugger
当科学方法看起来也很矛盾时,只能深入Debugger。由于处理图像时,循环较多,一个点一个点的来不现实,而且输入通常都很复杂,bug也通常发生在复杂输入的情况下…这时设置一个“陷阱"就很重要。在单线程中运行,同一组随机数情况下找出bug点,在疑似错误代码段前添加仅在疑似错误条件下执行的断点,使得运行停止在疑似错误段前,单步运行找出问题。你也可以使用assert断言检查。

数据可视化
例如光线追踪的情况下画出"光线树",或者将采样过的点”标记“出来。将程序内部的数据状态能够在优化程序的同时更好的理解代码的行为或意义。可以使用matlab或Gnuplot(一款数据可视化数学软件)脚本辅助输出数据。

本书编程风格参考
Effective C++ series(Meyers, 1995, 1997)
The Practice of Programming (Kernighan & Pike, 1999)
Extreme Programming(Beck & Andres, 2004)

转载请注明出处!!!

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值