《OpenGL超级宝典(第5版)》——第1章,第1.2节3D图形技术和术语

简介:

本节书摘来自异步社区《OpenGL超级宝典(第5版)》一书中的第1章,第1.2节3D图形技术和术语,作者 【美】Richard S. Wright , Jr.Nicholas Haemel,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.2 3D图形技术和术语
本书的每一章都包含一个或多个示例程序用来演示这一章所讨论的编程技术。尽管本章有意避免了关于编程细节的讨论,但仍提供了一个示例程序向读者演示最低程度上需要熟悉的技术和术语,以帮助读者充分地利用本书。本章的示例程序叫做BLOCK,读者可以从随书提供的示例程序集中的“Chapter 1”文件夹中找到它。

将数学和图形数据转换成3D空间图像的操作叫做渲染(Rendering)。当这个术语作为动词使用时,指的是计算机创建三维图像时所经历的过程。它也作为名词使用,指的仅仅是最终的图像作品。这个术语在本书中会经常出现。现在我们来看一看渲染过程中出现的其他一些属于和操作。

1.2.1  变换(Transformation)和投影(Projection)
图1.4所示是BLOCK示例程序的原始输出结果,显示的是用线条绘制的一个放置在一张桌子或一个平面上的立方体。通过变换(Transformation),或者说旋转这些点,并在它们之间绘制线段,我们就能在平面的2D屏幕上创造出一个3D世界的错觉。早期的飞行模拟器所使用的技术不过如此。


578ad6098a3bae76469c94fee07d6254646fc3cc

图1.4 一个简单的线框立方体和桌子

这些点本身叫做顶点(Vertices,单数为Vertex),它们能够通过一种称为变换矩阵(Transformation Matrix)的数学结构进行旋转(本书第4章将详细讲解变换矩阵相关内容)。另外还有一种矩阵叫做投影矩阵(Projection Matrix),用于将3D坐标转换成二维屏幕坐标,实际的线条也将在二维屏幕坐标上进行绘制。

1.2.2  光栅化(Rasterization)
实际绘制或填充每个定点之间的像素形成线段就叫做光栅化(Rasterization)。我们可以通过隐藏表面消除(Hidden Surface Removal)来进一步澄清3D设计意图。图1.5所示显示了在BLOCK示例程序第一次按空格键后的输出。虽然使用的仍然是点和线段,但是一个放置在桌面上的正方体的错觉却更加逼真了。


8ca0d268bcc64f30c78de2d0cef2177217f73997

图1.5 隐藏固体几何体的背面能够加强3D错觉

虽然用线段绘图【也称做线框渲染(Wireframe Rendering)】也有它的用处,但在大多数情况下我们并不是用线段,而是用实心三角形进行渲染。像线段一样,三角形和多边形也会被光栅化或填充。早期的图形硬件能够用纯色对三角形进行填充,但正如图1.6所示的那样,这样做并不能增强3D错觉。早期的游戏和模拟技术可能会在相邻的多边形上采用不同的纯色,这确实有所帮助,但却不能令人信服地对现实进行模拟。


8c1cc99bb34e0f3946e81964eb09122a941ad62b

图1.6 使用纯色对几何图形进行填充的方法几乎没什么效果

1.2.3 着色
在图1.7(在运行BLOCK示例程序时再次按空格键)中展示了着色(Shading)的效果。通过沿着表面(在顶点之间)改变颜色值,能够轻松创建光线照射在一个红色立方体上的效果。


9352f8a98071e3b7f9a1e6aefbe5a8f19bf5acef

图1.7  对表面进行着色能够创建光照错觉

光照和着色在3D图形专业领域占据了非常大的比重,并且有专门论述它们的书籍。另一方面,着色器(Shader)则是在图形硬件上执行的单独程序,用来处理顶点和执行光栅化任务。

1.2.4  纹理贴图
接下来要介绍的硬件技术进步是纹理贴图(Texture Mapping)。一个纹理不过是一幅用来贴到三角形或多边形上的图片。正如我们在图1.8中看到的,这些纹理将渲染提高到了一个崭新的层次。


f0edaa2a9e9b59f53ced871e344ea37bfdcf426b

图1.8 一个纹理堪比上千个三角形

在如今的硬件上,纹理是快捷有效的,而一个纹理所能再现的表面如果用三角形来实现的话,可能需要几千甚至几百万个。

1.2.5  混合
最后,图1.9所示展示了混合(Blending)的效果。混合时我们能够将不同的颜色混在一起。我们首先上下颠倒地绘制这个立方体,然后再在它上面绘制地板并与它进行混合,在绘制正常方向的立方体,就能获得这种反射效果。我们确实“透过”地板看到了下面颠倒的立方体。大脑告诉我们,“哦……这是个倒影”。我们也可以应用混合使物体看起来透明。实际上,在图1.9中真正看到的倒立立方体其实是“透过”地板看到的。


989371d6885813ffa77909c0851448838ba37870

图1.9 使用混合来创建反射效果

1.2.6  将点连接起来
总而言之,上述内容大概就是所谓的计算机图形了。实心3D几何体无非是将顶点间的点连接起来,然后对三角形进行光栅化而使对象变得有实体。变换、着色、纹理与混合——我们在电影、电视游戏、医疗或商业应用中看到的任何计算机渲染场景都无非是灵活地运用这4种技术而产生的。

相关文章
|
7月前
QT4.7版本的OPENGL的3D旋转模型例子
QT4.7版本的OPENGL的3D旋转模型例子
130 0
ly~
|
2月前
|
数据可视化 BI API
除了 OpenGL,还有哪些常用的图形库可以在 C 语言中使用?
除了OpenGL,C语言中还有多个常用的图形库:SDL,适合初学者,用于2D游戏和多媒体应用;Allegro,高性能,支持2D/3D图形,广泛应用于游戏开发;Cairo,矢量图形库,支持高质量图形输出,适用于数据可视化;SFML,提供简单接口,用于2D/3D游戏及多媒体应用;GTK+,开源窗口工具包,用于创建图形用户界面。这些库各有特色,适用于不同的开发需求。
ly~
256 4
|
4月前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
267 0
|
7月前
|
前端开发 API vr&ar
Android开发之OpenGL绘制三维图形的流程
即将连载的系列文章将探索Android上的OpenGL开发,这是一种用于创建3D图形和动画的技术。OpenGL是跨平台的图形库,Android已集成其API。文章以2D绘图为例,解释了OpenGL的3个核心元素:GLSurfaceView(对应View)、GLSurfaceView.Renderer(类似Canvas)和GL10(类似Paint)。通过将这些结合,Android能实现3D图形渲染。文章介绍了Renderer接口的三个方法,分别对应2D绘图的构造、测量布局和绘制过程。示例代码展示了如何在布局中添加GLSurfaceView并注册渲染器。
203 1
Android开发之OpenGL绘制三维图形的流程
|
存储
QT+OpenGL开始3D
顶点坐标起始于局部空间,它在之后会变为世界坐标,观察坐标,裁减坐标,并最后以屏幕坐标的形式结束。
111 0
|
Android开发 C++
Android OpenGL显示任意3D模型文件
Android OpenGL显示任意3D模型文件
Android OpenGL显示任意3D模型文件
|
存储 缓存 Java
Android OpenGL 显示基本图形及相关概念解读
Android OpenGL 显示基本图形及相关概念解读
Android OpenGL 显示基本图形及相关概念解读
|
图形学
学习OpenGL ES之绘制更多的图形
学习OpenGL ES之绘制更多的图形
OpenGL几种简单图形的绘制
圆、五角星、正弦函数图形的绘制
354 0
|
存储 算法 编译器
OpenGL简介以及术语总结
OpenGL (Open Graphics Library)是⼀个跨编程语⾔、跨平台的编程图形程序接⼝,它将计算机的资源抽象称为⼀个个OpenGL的对象,对这些资源的操作抽象为⼀个个的OpenGL指令。
248 0