Direct3D 11教程2:绘制一个三角形

概览

在前面的教程中,我们创建了一个最小化的Direct3D 11程序在平面上输出了单一的颜色。

本教程中,我们会在屏幕上绘制一个三角形。我们会学习设置三角形数据结构的方法。

程序截图

源代码

(SDK root)\Samples\C++\Direct3D10\Tutorials\Tutorial02

三角形的构成

三角形由三个点定义,这些点又叫顶点(vertex)。确定位置的三个顶点定义了一个唯一的三角形。要让GPU绘制一个三角形,我们必须告知三个顶点的位置。例如我们想绘制一个如图1所示的三角形,我们需要将顶点位置(0, 0)、(0, 1)和(1, 0)传递到GPU,这样GPU就拥有足够的信息绘制这个三角形了。

图1

图1. 一个三角形由三个顶点定义

那么如何将顶点信息传递到GPU中?在Direct3D 11中,诸如位置之类的顶点信息是存储在一个缓存资源中的。存储顶点信息的缓存叫做顶点缓存(vertex buffer)。我们必须创建一个足够包含三个顶点大小的顶点缓存,并将顶点位置存储其中。在Direct3D 11中,程序必须以字节为单位设置缓存大小。我们知道缓存必须大到足够包含三个顶点,那么每个顶点需要多少字节呢?要回答这个问题,需要理解顶点格式(vertex layout)

输入格式(Input Layout)

一个顶点具有位置信息,但往往不只包含位置信息,还可能包含法线、一个或以上的颜色、纹理坐标(用于纹理映射)等信息。顶点格式定义了这些信息属性在内存中时如何放置的:每个属性使用何种数据类型,每个属性的大小,在内存中的顺序。因为属性通常使用不同的类型,类似于C结构中的字段,所以顶点通常使用结构来表示,顶点的大小可以方便地从结构的大小获取。

本教程中,我们只使用顶点的位置信息。所以,我们定义的顶点结构中只使用一个XMFLOAT3类型的字段。这个类型表示一个由三个浮点数作为分量的矢量,这是3D中表示位置的典型数据结构。


1
2
3
4
struct SimpleVertex
{
     XMFLOAT3 Pos;  // Position
};

现在我们有了表示顶点的结构体,这个结构负责将顶点信息储存到系统内存中。但是,当我们将顶点缓存传递到GPU的时候,我们传递的只是一块内存中的信息。GPU必须知道顶点格式才能从缓存中提取正确的属性,要实现这个目的,需要使用一个输入格式(input layout)

在Direct3D 11中,输入结构是一个Direct3D对象,这个对象表示可以被GPU理解的顶点结构。每个顶点属性可以由D3D11_INPUT_ELEMENT_DESC结构表示。应用程序定义一个数组,这个数组包含一个或多个D3D11_INPUT_ELEMENT_DESC,然后使用这个数组创建输入格式对象,这个对象表示以整体的形式表示顶点。下面我们看一下D3D11_INPUT_ELEMENT_DESC 字段的细节。

SemanticName Semantic(语义)名称是一个字符串,包含一个表示这个元素特性或目的(或语义)单词。这个单词可以是任何一个C标示符,我们可以任意选择。例如,表示顶点位置的语义名称POSITION就很好。语义名称不是大小写敏感的。
SemanticIndex Semantic索引补充说明语义名称。一个顶点的统一特性可能有多个属性。例如,一个顶点可能有2组纹理坐标和2组颜色。你可以使用语义名称加数字的形式,例如“COLOR0”和“COLOR1”,你也可以使用语义索引0和1代替,这样两个元素可以共享相同的语义名称“COLOR”。
Format Format定义了用于这个元素的数据类型。例如,DXGI_FORMAT_R32G32B32_FLOAT格式有3个32位浮点数,让元素的长度为12个字节。DXGI_FORMAT_R16G16B16A16_UINT格式有4个16位无符号整数,元素长度为8个字节。
InputSlot
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值