【DirecX 教程】Lesson 6:理解图形概念



Lesson 6:理解图形概念

课程一览

首先我正式欢迎你进入Direct3D学习。我想教你所有的关于3D编程的基础和高级主题。你是否想构建自己的引擎?不管是借用还是修改或者购买来使用它,最重要的是理解背后的概念。

正像游戏引擎潜在概念的重要性一样,Direct3D的潜在概念也很重要。本节我们会介绍Direct3D的基础并让你知道如何打造你的第一个Direct3D程序。

这第一课就是理论课。我们会在下一节课介绍实践。

图形硬件

对图形编程好的理解需要对涉及图形的硬件有一个好的理解。Direct3D与其说是一个游戏平台不如说是一个硬件接口。

你在Direc3D里做的每一件事都是为了操作图形硬件本身。如果不理解图形硬件,那么Direct3D几乎无用。

我们对用于图形编程的硬件的主要兴趣点是GPU,即图形处理单元。不同于CPU执行计算并指导整个电脑。GPU执行图形计算并指导图形输出到显示器。

除了有自己单独的处理器,图形编程还使用完全独立的存储部分叫做显存。它是物理独立的。显存通常存在于显卡而不是主板,所以GPU可以很快访问。显存用来存储屏幕当前的图像和任何可能会用于编译下个图像的数据。

DirectX图形基础结构(DXGI)

DirectX图形基础结构是一个依赖最新Direct3D版本的组件。它的任务是处理像显示图像、找到显示器和显卡可以处理的分辨率的基础任务。

DXGI并不是Direct3D的一部分。它是Direct3D和其他图形组件的基础,它充当Direc3D和硬件之间的接口。

有多个方式可以直接处理DXGI,但重要的是你意识到这个组件的存在,就好像Direct3D有一部分是专门处理DXGI的

交换链

GPU的存储器中包含一个指向像素缓冲区的指针,像素缓冲区包含当前被显示到屏幕的图像。当你需要渲染3D模型或者图片的时候GPU更新这个数组并发送消息给显示器以显示。稍后显示器就会自顶向下重绘屏幕,以新的图像代替老的图像。

但是有个小毛病就是显示器不能如所需的实时渲染那样快速刷新。大多数刷新频率范围从60Hz(60fps)到100Hz.如果在显示器正在刷新的时候GPU渲染另一个模型,那么图象显示将会分为两半,顶部包含了旧的图像,底部是新图像。这种效果就叫做撕裂。

为了避免图像撕裂,DXGI实现了一个功能称为交换。

DXGI在一个辅助像素缓冲区(后台缓冲)上绘制你的图像而不是直接把新图像渲染到显示器。前台缓冲区将会是当前被显示的缓冲。你把你的所有图像都绘制到后台缓冲区,完成后DXGI会用后台缓冲内容更新前台缓冲,丢弃旧的图像。

但是这么做依旧引起撕裂,因为图像转印在显示器刷新时仍旧会发生(GPU比显示器要快)。

为了避免(无论如何使所有事情都更快),DXGI为每一个缓冲区(前台和后台)都分别使用一个指针,并且仅仅切换它们的值。后台缓冲区随即变成前台缓冲(反之亦然),没有撕裂发生。

当然为了使我们的游戏有更好的性能可以添加额外的后台缓冲,像这样。

这种设置称为交换链,就像它是一个缓冲链,每次一个新的帧被渲染后就交换位置。

渲染管线

图形编程中有一个东西可能是你听的最多的,那就是渲染管线。这是因为渲染管线在每件事情发生的地方都有。

渲染管线是渲染产生一个3D图像到屏幕上的过程。它的机制就像是一个流水线,一个接一个。它组成的步骤在GPU上被执行。

我们没有在这里介绍所有的步骤。为了开始我们需要明白以下将要介绍的步骤,然后可以探索剩下的步骤。

装配输入阶段是管线的第一步。它的责任就好比咀嚼食物。它从显存收集关于3D模型的信息。然后编译信息以备渲染。

光栅化阶段负责决定后台缓冲区图像被绘制的地方,或者更具体地说就是精确的绘制像素和颜色。

混合输出阶段是管线的最终步骤。它的工作是把个别的模型图像结合为一个完整的图像,并把图像正确地放在后台缓冲区。

坐标系统

不理解3D数学的基础就无从进行3Db编程。我的意思不是说要再来一遍大学代数课程,只是要理解3D坐标系的概念就好了,包括他们的工作机制和你会用到的那部分知识。

在3D渲染中,有几类坐标系我们需要知道。第一个你可能听过,叫作笛卡尔坐标系。

笛卡尔坐标系统

笛卡尔坐标系统如果叫作2D坐标系可能会有更好的认可。换句话说它是一个在平面定位精确点的系统。

一个点是以轴为参考来定义精确位置的。如果我们想知道走了多远,我们通常给出一个精确值,例如“Bob走了12米”。12米是沿着单个坐标轴的距离。我们说0是我们的开始点,这是一个1D坐标系统。

当我们从侧面看这个场景,如下图所示,我们可以看到当Bob继续朝着屏幕右边走的时候,他离0点的距离在增加。我们称这个‘0’原点是他开始的地方。在原点的另一边我们用负值代替正值。

但是当他转90度方向前进会怎么样?Bob将会沿着第二个坐标轴走,我们这样图解它的路径

现在我们不止有一条坐标轴,水平轴沿着Bob走的12米,就叫X轴,垂直轴叫作y轴。

当然轴是有方向的。

这俩轴就形成了我们的笛卡尔坐标系。我们可以根据他离每个方向轴的距离精确给出Bob的精确位置,所以我们可以说他在(x,y)或者(12,4)

这些2值就叫作坐标,他们用来精确显示离原点(所有轴的0点)的距离。

3D坐标系

实际上3D坐标系只不过是我们刚才讨论的一个扩展。如果我们给笛卡尔坐标添加第3个轴(Z轴),它与x和y轴都垂直,我们就有了3D坐标。


像笛卡尔坐标一样3D坐标也是有正有负。但是取而代之的是3D坐标用3个数来表示:(X,Y,Z)或者(12,4,-15)。这可能意味着Bob在某种程度上迷失在一个地牢里。。

3D几何

现在让我们介绍一下3D坐标如何应用于游戏和游戏编程。如果3D坐标系中的一个点代表了一个空间位置,我们可以塑造一个位置数组,它最终将成为一个3D模型。当然设置如此多的点会占用大量的存储空间,所以一个更快更简单的途径被采用。这个方法采用三角形。

三角形在任何数学领域都是一个有用的形状。它们可以测量圆,用于加固建筑,创建3D图像。我们使用三角形的理由就是它们可以用于形成任何想象的到的形状:

因为三角形创建3D模型的有用特征,Direct3D被设计成只用单独的三角形和使用三角形合成形状。我们用顶点构建三角形。

Vertices是vertex的复数。一个顶点被定义为3D空间的精确点。它用3个值(x,y,z)来定义,在Direct3D里我们再加一点。我们给这些点包含各种属性。所以我们扩展定义的含义为“3D空间的定位和点的属性”。

一个三角形是由三个顶点组成的,每个在程序中以顺时针定义。编码的时候这三个顶点形成一个平面,这个平面可以被旋转,添加纹理,放置和修改。

图片中显示的三角形由三个点创建:

X=0,y=5,z=1

x = 5, y = -5, z = 1 
x = -5, y = -5, z = 1

你会注意到上面的顶点都有一个Z值为1.这是因为我们不讨论3D对象;我们在聊三角形,它是2D对象。我们可以改变Z值,但是它并不会有本质区别。

为了做真正的3D物体,我们需要合并三角形。例如立方体的每个面是由两个三角形创建的。每个面都是由相同的三角形组成结合的。

但是在你的游戏中多次定义每一个三角形的3D坐标是很冗长乏味的,复杂到笑尿!

你需要做的所有东西就是创建一个顶点列表,它包含了每个顶点的坐标和信息,当然还有它们的顺序。

图元(基本物体)

一个图元在3D环境中是一个单独的元素,可以是三角形,一条线,一个点或者其它的东西。下面是可以结合创建3D物体的图元列表方式

1. Point Lists 
2. Line Lists 
3. Line Strips 
4. Triangle Lists 
5. Triangle Strips

1. Point Lists

一个Point Lists是一个顶点列表,在屏幕上显示为孤立点。这对渲染3D星空、创建虚线、小地图显示定位等等是很有用的。

2. Line Lists

一个Line Lists是创建每个奇数顶点和下个顶点间线段的顶点列表。这些可用于很多的效果,包括3D网格,大雨,路标线等等。


3. Line Strips

与line list类似,不同点在于这个列表的所有点是由线段连接的。这对创建很多线框图是有用的,例如线框地形,草叶和其它非基于模型的物体。主要用于调试程序。

4. Triangle Lists

Triangle Lists是用来创建一系列彼此连接的三角形的顶点列表。这在处理3D图像时是有用的方法。通常用于创建你游戏中的3D模型。注意最先的三个顶点创建了一个三角形,随后的三角形在其基础上创建。

A Primitive Quirk(图元特性)

在绘制只显示图元一面的时候有一个容易忽略的特性。可能会显示所有的面,但是一个模型通常是封闭的,你看不到里面。如果一个模型是完全封闭的,只有每个三角形的一面需要绘制。毕竟绘制图元的所有面需要花费2倍时间。接下来的课中你会看到一个例子。

一个三角形图元只有在它的顶点顺时针给出的时候才被绘制。如果逆时针就不会显示出来。


有一个显示图元所有面的简单途径,就是显示图元两次,一个顺时针,一个逆时针


总结

在有了一个好的基础知识理解的情况下图形编程是一个简单的主题。如果你依旧对这些概念有疑问,不要太担心。你会在下面的课程看到他们的重要性,你可以着重回顾本科。

那么让我们开始吧!前面有冒险等着我们! 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值