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插件的下载地址:点我下 ...
随机推荐
- 如何直接执行js代码
安装node.js 进入cmd ,输入node js文件名
- webpack初识
1.什么是Webpack WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等) ...
- Unity Shader入门精要之 screen post-processing effect
本篇记录了学习Unity Shader入门精要的屏幕后处理的一些知识点. OnRenderImage(RenderTexture src, RenderTexture dest) 以上函数是Unity ...
- python标准库中socket模块详解
包含原理就是tcp的三次握手 http://www.lybbn.cn/data/datas.php?yw=71 这篇讲到了socket和django的联系 https://www.cnblogs.co ...
- php爬虫最最最最简单教程
php爬虫最最最最简单教程 一.总结 一句话总结:用的爬虫框架,却是用的自己的例子(因为网站结构的变化,作者的例子不一定好用) 爬虫框架 自己例子 1.发现自己的运行效果和作者的不一样怎么办? 耐下性 ...
- Squid代理配置
更改squid错误页面时间不对的问题解压源码包,进入此路径/usr/local/squid/share/errors/zh-cn(需要更改该目录下的所有文件find -type f |xargs se ...
- LeetCode--350--两个数组的交集2
问题描述: 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = ...
- android--------自定义控件 之 基本流程篇
在我们平常的Android开发中经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件 自定义控件可以设计出很多你想要的功能和模块,在开发中是很重要的 ...
- 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 想要变成如下:一进一出为一 ...
- 什么是V模型?使用SDLC和STLC学习案例研究
本教程详细介绍了软件/系统开发生命周期(SDLC),如瀑布循环和迭代循环,如RAID和Agile.此外,它继续解释测试的V模型和STLC(软件测试生命周期). 假设为您分配了一项任务,即为客户开发自定 ...