在介绍如何使用Direct3D项目模版来绘制立体图形之前,首先为读者介绍在Direct3D应用程序开发过程中涉及到的一些常用概念。

(1)资源

资源是指可以被Direct3D图形管线所访问的内存空间,Direct3D使用资源来存储输入输出数据,如几何、纹理和着色数据。在Direct3D图形管线中将资源分为缓存资源和纹理资源,这些资源的具体含义如下:

  • 缓存资源,是一组指定类型的数据集合,分为顶点缓存、索引缓存和常量缓存。其中顶点缓存用于存储顶点的位置、法线、纹理和颜色等数据,索引缓存用于存储顶点的索引,一个索引缓存可以指向多个顶点缓存,常量缓存则用于存储着色器的常量数据。
  • 纹理资源,是一种用于存储纹理的结构资源,这些纹理包括了一维、二维和三维纹理。

(2)颜色

绘制三维立体图形时,通常会指定图形的各个顶点的颜色来对图形进行渲染。Direct3D中使用RGB和RGBA两种方式来描述颜色,其中R、G、B分别表示红色、绿色和蓝色,A为Alpha值,用于表示透明度。

在Direct3D中使用XMFLOAT3结构体来储存RGB颜色值,定义此结构体的代码如下所示:

struct XMFLOAT3 {

    float x;

    float y;

    float z;

};

从上面的代码中可以看到,在XMFLOAT3结构体中定义了三个float类型的变量x、y和z,此结构体用于储存任意的三个浮点数,如RGB颜色值和顶点的坐标等。这里使用XMFLOAT3结构体中的x变量、y变量和z变量,分别储存R、G、B的颜色值。

通过使用XMFLOAT4结构体来存储RGBA颜色值,定义此结构体的代码如下所示:

struct XMFLOAT4 {

    float x;

    float y;

    float z;

    float w;

};

在XMFLOAT4结构体中定义了四个float类型的变量x、y、z和w,其中前三个变量分别用于存储R、G、B的颜色值,w变量则用于存储Alpha值。同XMFLOAT3结构体相似,XMFLOAT4结构体用来储存任意的四个浮点数,在后面的示例中将使用此结构体来储存矩阵。

(3)图形顶点

使用Direct3D绘制立体图形之前,首先要确定立体图形的顶点,使用这些顶点来构成一个立体图形。一个图形顶点包含坐标、颜色和法线等信息,在Direct3D中通常使用一个自定义的结构体来保存这些信息。下面的代码片段定义了一个简单的结构体,在此结构体保存了图形顶点的坐标和颜色信息。

//自定义一个结构体

struct VertexPositionColor

{

    //保存图形顶点的坐标

    DirectX::XMFLOAT3 pos;

    //保存图形顶点的颜色

    DirectX::XMFLOAT3 color;

};

在上面的代码片段中,定义了一个结构体VertexPositionColor,并在此结构体中定义两个XMFLOAT3结构体的变量pos和color,分别用于保存图形顶点的坐标和颜色信息。其中坐标信息指顶点的X轴、Y轴和Z轴的坐标,颜色信息则指顶点的RGB颜色值。

VertexPositionColor结构体中所保存的顶点信息需要被显卡识别以后,才能使用这个结构体中的顶点信息来创建一个顶点,在Direct3D中使用D3D11_INPUT_ELEMENT_DESC结构体来描述VertexPositionColor结构体中的顶点信息,此结构体依次包含了如下的成员:

  • SemanticName变量,用于描述元素的目的或者语义,如使用POSITION来描述顶点的坐标。
  • SemanticIndex变量,用于区分具有相同目的或语义的元素,如一个顶点包含两个颜色信息,而这两个颜色信息的SemanticName都为COLOR时,则将SemanticIndex变量分别设置成0和1来进行区分。
  • Format枚举变量,用于指定元素的格式,如使用DXGI_FORMAT_R32G32B32_FLOAT指定元素的格式为三个32位浮点数,元素的总长为12字节。
  • InputSlot变量,此变量的值为0~15的整数,在Direct3D 11中最多可以将16个顶点缓存并行地传递给显卡,其中每一个缓存使用唯一的InputSlot变量值来区分。
  • AlignedByteOffset变量,用于定义缓存的对齐方式,使GPU能获取到此缓存。
  • InputSlotClass枚举变量,一般赋值为D3D11_INPUT_PER_VERTEX_DATA。
  • InstanceDataStepRate变量,此变量用于实例技术,若不使用实例技术则赋值为0。

由于在VertexPositionColor结构体中保存了顶点的坐标和颜色信息,因此需要定义一个D3D11_INPUT_ELEMENT_DESC类型的数组来分别描述顶点的坐标和颜色信息。代码如下所示:

//定义一个D3D11_INPUT_ELEMENT_DESC类型的数组

const D3D11_INPUT_ELEMENT_DESC vertexDesc[] =

{

    //描述顶点的坐标信息

    { "POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,D3D11_INPUT_PER_VERTEX_DATA,0},

    //描述顶点的颜色信息

    { "COLOR",0,DXGI_FORMAT_R32G32B32_FLOAT,0,12,D3D11_INPUT_PER_VERTEX_DATA,0},

};

在Direct3D中绘制的立体图形一般包含多个顶点,可以定义一个VertexPositionColor类型的数组来保存这些顶点中的信息,代码如下所示:

VertexPositionColor cubeVertices[] =

{

    //顶点{1.0f, 0.0f, 0.0f}

    {XMFLOAT3(1.0f, 0.0f, 0.0f), XMFLOAT3(1.0f, 0.0f, 0.0f)},

    //顶点{0.0f, 1.0f, 0.0f}

    {XMFLOAT3(0.0f, 1.0f, 0.0f), XMFLOAT3(0.0f, 1.0f, 0.0f)},

};

在上面的代码片段中,定义了一个VertexPositionColor类型的数组cubeVertices,此数组保存了两个顶点,这两个顶点的坐标分别为{1.0f, 0.0f, 0.0f }和{0.0f, 1.0f, 0.0f },其中第一个顶点的颜色为红色,而第二个顶点的颜色为绿色。

(4)三维图元

三维图元是组成一个三维图形的基本单元,包括点、线和三角形。其中三角形是较为常用的三维图元,用来组成复杂的多边形、网格和光滑的曲面。

在Direct3D应用程序中若要绘制点、线和三角形这些图元,需要指定图元的拓扑类型,常用的拓扑类型如下所示:

接下来介绍如何在Direct3D中指定图元的拓扑类型,以及使用指定的图元的拓扑类型所绘制出的效果。首先创建图形的顶点,代码如下所示:

VertexPositionColor cubeVertices[] =

{

    //顶点{0.0f, -0.3f, -0.3f}

    {XMFLOAT3(0.0f, -0.3f, -0.3f), XMFLOAT3(1.0f, 0.0f, 0.0f)},

    //顶点{0.0f, -0.3f, 0.3f}

    {XMFLOAT3(0.0f, -0.3f, 0.3f), XMFLOAT3(1.0f, 0.0f, 0.0f)},

    //顶点{0.0f, 0.3f, 0.0f}

    {XMFLOAT3(0.0f, 0.3f, 0.0f), XMFLOAT3(1.0f, 0.0f, 0.0f)},

};

在上面的代码片段中,定义一个VertexPositionColor类型的数组cubeVertices,在此数组中保存了三个图形顶点,这些顶点的坐标为{0.0f, -0.3f, -0.3f }、{0.0f, -0.3f, 0.3f }和{0.0f, 0.3f, 0.0f },颜色都为红色。

接下来通过调用一个ID3D11DeviceContext类型的对象m_d3dContext中的IASetPrimitiveTopology函数,指定图元的拓扑类型为线段条带,来绘制出首尾相接的线段。代码如下所示:

//指定图元的拓扑类型为线段条带

m_d3dContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_LINESTRIP);

通过上述的代码指定图元的拓扑类型为线段条带以后,可以在应用窗口中看到图20-20所示的效果。

图20-20 首尾相接的线段

接着指定图元的拓扑类型为三角形列表,来绘制出独立的三角形。代码如下所示:

//指定图元的拓扑类型为三角形列表

m_d3dContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

通过上述的代码指定了图元的拓扑类型为三角形列表以后,可以看到,使用同样的图形顶点在应用窗口中绘制了一个三角形,如图20-21所示。

图20-21 独立的三角形

Win10系列:VC++ Direct3D开发基础1的更多相关文章

  1. AutoCAD ObjectARX(VC)开发基础与实例教程2014版光盘镜像

    AutoCAD ObjectARX(VC)开发基础与实例教程2014,最新版,光盘镜像 作者:张帆 朱文俊 编著 出版社:中国电力出版社 出版时间:2014年6月 点击一下

  2. 【Xamarin开发 Android 系列 4】 Android 基础知识

    原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...

  3. mysql 开发基础系列12 选择合适的数据类型(上)

    一. char 与varchar比较 在上图的最后一行的值只适用在"非严格模式",关于严格模式后面讲到.在“开发基础系列4“ 中讲到CHAR 列删除了尾部的空格.由于char是固定 ...

  4. WebRTC开发基础(WebRTC入门系列1:getUserMedia)

    什么是WebRTC WebRTC由IETF(Internet Engineering Task Force——互联网工程任务组)和W3C(World Wide Web Consortium——万维网联 ...

  5. SAP-ABAP系列 第二篇SAP ABAP开发基础

    第二章SAP ABAP开发基础 1.ABAP数据类型及定义 ABAP程序中共包含8种基本数据类型定义, 类型名称 描述 属性 C Character Text (字符类型) 默认长度=1,默认值 = ...

  6. 从零3D基础入门XNA 4.0(1)——3D开发基础

    [题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入门文章,发现大都需要一些3D基础,而我之前并没有接触过 ...

  7. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记4——Direct3D编程基础

    第11章 Direct3D编程基础 2D游戏是贴图的艺术,3D游戏是渲染的艺术.这句话在我学过了之前的GDI编程之后,前一句算是有所体会,现在是来理解后一句的时候了. 安装DirectX SDK配置啥 ...

  8. .NET基础拾遗(6)ADO.NET与数据库开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  9. emmet 系列(1)基础语法

    emmet 系列(1)基础语法 emmet 是一个能显著提升开发html和css开发效率的web开发者工具 emmet基本上目前已知的编辑器都有相应的插件,各个编辑器的emmet插件的下载地址:点我下 ...

随机推荐

  1. 如何直接执行js代码

    安装node.js 进入cmd ,输入node js文件名

  2. webpack初识

    1.什么是Webpack WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等) ...

  3. Unity Shader入门精要之 screen post-processing effect

    本篇记录了学习Unity Shader入门精要的屏幕后处理的一些知识点. OnRenderImage(RenderTexture src, RenderTexture dest) 以上函数是Unity ...

  4. python标准库中socket模块详解

    包含原理就是tcp的三次握手 http://www.lybbn.cn/data/datas.php?yw=71 这篇讲到了socket和django的联系 https://www.cnblogs.co ...

  5. php爬虫最最最最简单教程

    php爬虫最最最最简单教程 一.总结 一句话总结:用的爬虫框架,却是用的自己的例子(因为网站结构的变化,作者的例子不一定好用) 爬虫框架 自己例子 1.发现自己的运行效果和作者的不一样怎么办? 耐下性 ...

  6. Squid代理配置

    更改squid错误页面时间不对的问题解压源码包,进入此路径/usr/local/squid/share/errors/zh-cn(需要更改该目录下的所有文件find -type f |xargs se ...

  7. LeetCode--350--两个数组的交集2

    问题描述: 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = ...

  8. android--------自定义控件 之 基本流程篇

    在我们平常的Android开发中经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件 自定义控件可以设计出很多你想要的功能和模块,在开发中是很重要的 ...

  9. SQL SERVER 一组数据按规律横着放置,少则补空,如人员按一进一出的规律,进出为一组,缺少的补null

    假设一组数据:人员进出刷卡数据表[SwingCard] ID MenID Door 1 1 In 2 1 In 3 1 Out 4 1 In 5 1 Out 6 1 Out 想要变成如下:一进一出为一 ...

  10. 什么是V模型?使用SDLC和STLC学习案例研究

    本教程详细介绍了软件/系统开发生命周期(SDLC),如瀑布循环和迭代循环,如RAID和Agile.此外,它继续解释测试的V模型和STLC(软件测试生命周期). 假设为您分配了一项任务,即为客户开发自定 ...