Win10系列:VC++ Direct3D开发基础1
在介绍如何使用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应用程序中若要绘制点、线和三角形这些图元,需要指定图元的拓扑类型,常用的拓扑类型如下所示:
- D3D_PRIMITIVE_TOPOLOGY_POINTLIST,指定图元的拓扑类型为顶点列表。
- D3D_PRIMITIVE_TOPOLOGY_LINELIST,指定图元的拓扑类型为线段列表。
- D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST,指定图元的拓扑类型为三角形列表。
- D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP,指定图元的拓扑类型为三角形带。
接下来介绍如何在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的更多相关文章
- AutoCAD ObjectARX(VC)开发基础与实例教程2014版光盘镜像
AutoCAD ObjectARX(VC)开发基础与实例教程2014,最新版,光盘镜像 作者:张帆 朱文俊 编著 出版社:中国电力出版社 出版时间:2014年6月 点击一下
- 【Xamarin开发 Android 系列 4】 Android 基础知识
原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...
- mysql 开发基础系列12 选择合适的数据类型(上)
一. char 与varchar比较 在上图的最后一行的值只适用在"非严格模式",关于严格模式后面讲到.在“开发基础系列4“ 中讲到CHAR 列删除了尾部的空格.由于char是固定 ...
- WebRTC开发基础(WebRTC入门系列1:getUserMedia)
什么是WebRTC WebRTC由IETF(Internet Engineering Task Force——互联网工程任务组)和W3C(World Wide Web Consortium——万维网联 ...
- SAP-ABAP系列 第二篇SAP ABAP开发基础
第二章SAP ABAP开发基础 1.ABAP数据类型及定义 ABAP程序中共包含8种基本数据类型定义, 类型名称 描述 属性 C Character Text (字符类型) 默认长度=1,默认值 = ...
- 从零3D基础入门XNA 4.0(1)——3D开发基础
[题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入门文章,发现大都需要一些3D基础,而我之前并没有接触过 ...
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记4——Direct3D编程基础
第11章 Direct3D编程基础 2D游戏是贴图的艺术,3D游戏是渲染的艺术.这句话在我学过了之前的GDI编程之后,前一句算是有所体会,现在是来理解后一句的时候了. 安装DirectX SDK配置啥 ...
- .NET基础拾遗(6)ADO.NET与数据库开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...
- emmet 系列(1)基础语法
emmet 系列(1)基础语法 emmet 是一个能显著提升开发html和css开发效率的web开发者工具 emmet基本上目前已知的编辑器都有相应的插件,各个编辑器的emmet插件的下载地址:点我下 ...
随机推荐
- [原][粒子特效][spark]发射器emitter
深入浅出spark粒子特效连接:https://www.cnblogs.com/lyggqm/p/9956344.html group添加emitter的方式: eimtter: 上图是spark源码 ...
- 力扣(LeetCode)191. 位1的个数
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量). 示例 1: 输入:00000000000000000000000000001011 输出:3 ...
- Codeforces 1053 C - Putting Boxes Together
C - Putting Boxes Together 思路: 求带权中位数 用树状数组维护修改 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) ...
- C++ 输出文件编码控制
c++ 读写文件需要包含fstream头文件. 读文件声明形如: ifstream fin("路径"): 写文件声明形如:ofstream fout("路径" ...
- php set_time_limit()的作用是什么
php set_time_limit()用法测试 一.总结 一句话总结:在php中set_time_limit函数是用来限制页面执行时间的,如我想把一个php页面的执行时间定义为5秒就可以set_ti ...
- Can't push you anymore...
为什么我们不趁着年轻去冒险? 等我们准备好,也许都已经被生活冲淡了激情. Go to different places,to meet different people. To try, to fin ...
- 使用Tomcat数据源的方式访问数据库(MySql) --Struts2框架应用与开发
1.为方便测试首先创建数据库和表,然后插入测试数据 2.打开Tomcat服务器安装目录的conf/下的context.xml,配置context.xml文件. 在<Context>标签 ...
- Node.js 知识(教程)
JavaScript on the Server JavaScript was originally built for web browsers, but with Node.js we can u ...
- p1474 Money Systems
就是背包,用O(n*m)的一维. #include <iostream> #include <cstdio> #include <cmath> #include & ...
- Python全栈开发,Day2(in,while else,格式化输出,逻辑运算符,int与bool转换,编码)
一.in的使用 in 操作符用于判断关键字是否存在于变量中 ? 1 2 a = '男孩wusir' print('男孩' in a) 执行输出: True in是整体匹配,不会拆分匹配. ? 1 2 ...