第三章 Direct3D中的绘制
- 格式:ppt
- 大小:561.50 KB
- 文档页数:38
标题:Direct3D11编程范例一、概述Direct3D11是微软公司开发的一种用于图形渲染的API(应用程序编程接口),广泛应用于Windows评台上的游戏开发和图形应用程序中。
本文旨在介绍Direct3D11编程的一些范例,帮助读者了解如何使用Direct3D11进行图形渲染。
二、绘制一个简单的三角形我们将介绍如何使用Direct3D11来绘制一个简单的三角形。
在Direct3D11中,图形的绘制需要通过几个步骤来完成。
1. 创建设备与设备上下文在使用Direct3D11进行图形渲染之前,首先需要创建一个设备对象和一个设备上下文对象。
设备对象代表了图形渲染的硬件设备,而设备上下文对象则用于管理渲染状态和执行渲染命令。
2. 定义顶点结构体在绘制三角形之前,需要定义顶点结构体来存储三角形的顶点信息。
一般来说,顶点结构体包含顶点的位置、颜色、法线等信息。
3. 创建顶点缓冲区接下来,需要创建一个顶点缓冲区来存储三角形的顶点数据。
顶点缓冲区是一个用于存储顶点数据的内存区域,可以通过它来传递顶点数据到GPU。
4. 编写顶点着色器和像素着色器顶点着色器和像素着色器是Direct3D11中用于处理顶点和像素的程序,它们需要通过HLSL(High Level Shading Language)来编写。
5. 绘制三角形可以使用设备上下文对象来执行绘制命令,将三角形的顶点数据送入GPU进行渲染。
通过以上步骤,我们就可以在Direct3D11中绘制一个简单的三角形了。
三、加载和渲染3D模型除了绘制简单的图形,Direct3D11还可以用于加载和渲染复杂的3D 模型。
在加载和渲染3D模型时,需要进行一些额外的步骤。
1. 导入模型文件在加载3D模型之前,首先需要从文件中导入模型的顶点数据和索引数据。
常用的模型文件格式包括OBJ、FBX等。
2. 创建顶点缓冲区和索引缓冲区接下来,需要根据导入的模型数据创建顶点缓冲区和索引缓冲区,以便将模型数据送入GPU进行渲染。
4. 设定Direct X应用程序中的Direct 3D现在进入有趣的部分!从现在起,我们将开始建立我们程序中的Microsoft Direct3D立即模式。
在本章中,我们会先检查在立即模式中有哪些可用的对象和接口。
然后我们会带您走过要建立一个立即模式程序框架的相关步骤。
在读过第三章后,您应该对DirectDraw定义程序代码已经适应了。
要记住,Direct3D是一个指向DirectDraw对象的COM接口。
因此Microsoft把硬件抽像层(HAL)叫作DirectDraw/Direct3D HAL。
此外,Direct3D利用DirectDraw绘图页作为前后缓冲区来显示3D场景和计算3D场景时的z缓冲区。
另外,Direct3D贴图是由DirectDraw绘图页所构成的,并且可以引用DirectDraw型态。
Direct3D立即模式对象和接口Direct3D立即模式是由一些COM对象和连到这些对象的接口所构成的,您可以用这种模式来建构和控制您程序中的3D世界。
在本段落中,我们会看到这些对象和他们的接口(以及一些DirectDraw对象和接口)。
DirectDraw物件和在第三章中您看到的一样,您可以用DirectDrawCreateEx函式来建立DirectDraw对象。
DirectDrawCreateEx函式开启了DirectX 7最新的DirectDraw和Direct3D接口。
您在任何Direct3D应用程序中所建立的第一个对象一定是DirectDraw对象,因为它负责并提供显示装置的存取功能,如此才能实作许多Direct3D的功能。
IDirectDraw7是DirectX 7中连到DirectDraw对象的最新版接口,而且它和之前版本有很大的不同。
我们也会在本书中使用到它。
DirectDrawSurface物件在一个Direct3D程序中,可以用DirectDrawSurface ( IDirectDrawSurface7接口)对象来建立前缓冲区、后缓冲区、贴图对映和深度缓冲区。
目录引言 (2)一、Direct3D多层纹理映射过程 (2)二、Direct3D多层纹理混合方法 (4)三、常用纹理颜色混合操作 (5)(一) 黑暗映射 (5)(二)混合纹理与材质漫反射颜色 (6)(三)混合黑暗贴图与材质漫反射颜色 (7)(四)发光映射 (9)(五)细节映射 (10)结束语 (12)参考文献 (13)摘要多层纹理映射是一种高级的纹理映射技术,纹理颜色混合是多层纹理映射的核心内容,它决定了多层纹理映射最后的效果。
使用多层纹理映射的关键是理解多层纹理之间的颜色混合方法,本文首先分析了Direct3D多层纹理混合的过程和方法,然后通过介绍了常用的几种多层纹理颜色混合应用。
关键词:Direct3D,纹理映射,多层纹理,纹理颜色混合Direct3D纹理颜色混合方法分析引言纹理映射是三维图形开发中的一个基本内容,多层纹理映射是一种高级的纹理映射技术,通过多层纹理映射可以一次将多个纹理图片映射到同一个物体表面。
纹理颜色混合是多层纹理映射的核心内容,它决定了多层纹理映射最后的效果。
Direct3D提供了多种多层纹理映射的颜色混合方法,以适应不同需要。
一、Direct3D多层纹理映射过程Direct3D最多支持8层纹理,也就是说在一个三维物体的表面可以同时拥有1~8张不同的纹理贴图。
Direct3D能够在一个渲染过程中把这些纹理颜色依次混合,渲染到同一个物体的表面。
每一个纹理层对应从0~7的索引序号,多层纹理映射能够模拟更为真实的三维世界。
例如,要显示具有周围景物倒影的光滑大理石地板,可以把大理石地板贴图设置为纹理层0,把具有周围景物倒影的贴图设置为纹理层1,然后通过设置Direct3D多层纹理混合操作,把纹理层0和纹理层1相混合,这是绘制出的三维物体就同时具有大理石地板和景物倒影的纹理颜色。
利用Direct3D多达8层的纹理混合,可以在图形显示系统中显示丰富多彩的图像。
Direct3D多层纹理混合过程如图1所示。
内容摘自《DirectX 9.0 3D 游戏开发编程基础》章节一.1.必备数学知识二.1.初始化Direct3D2.(固定)绘制流水线3.Direct3D 中的绘制4.颜色5.光照6.纹理映射7.融合技术8.模板三.9.字体10.网格(一)11.网格(二)12.自定义Camera 类13.地形绘制14.粒子系统15.拾取四.16.着色语言HLSL17.顶点着色器18.像素着色器19.效果框架一.1.必备数学知识1.1向量及坐标系选取,D3D 中以LH/RH 标记左手/右手坐标系。
1.2向量运算:数乘点积-用于计算两个向量的夹角(cos θ)及判断向量垂直。
叉积-计算与两个向量所在平面垂直的向量,可用于面片法向量的计算。
1.3矩阵:在3D 图形应用中,常用4X4矩阵和1X4行向量进行运算。
由于多数变换无法用3阶矩阵表示3维变换,因此3D 变换中的矩阵为4维矩阵。
由于3维坐标空间中点和向量具有相同的表示形式,因此在进行运算时,将点和向量扩展至4D 空间时,通过如下形式:123(,,,1)p p p p =表示点(保证能平移变换);以123(,,,0)v v v v =表示向量(防止平移变换)。
1.4 3维空间中的变换:平移矩阵、旋转矩阵、比例变换矩阵1.5平面D3DXPLANE 在D3D 中存储平面及相应操作。
平面定义为满足0()0n p p ∙-=的所有点的集合,因此可通过平面法向量n 和平面上一点0p 表示,在代码中存储n 和0d n p =-∙表示平面;平面可被看做4D 向量(n,d )进行变换;当平面被规范化(法向量为单位向量且重新计算d ),则n p d ∙+为p 点到平面的最短有符号距离。
1.6射线定义为0()p t p tu =+。
射线与平面的相交判定用于拾取的实现。
二.1. 初始化Direct3D1.1 Direct3D 提供了操纵图形设备(通过HAL 硬件抽象层)的API 。
由HAL 提供的硬件支持的功能可被D3D 接口操作;硬件不支持时由REF 设备实现,由D3DDEVTYPE 枚举类型成员指定。
返回总目录第一篇DirectX目录第一章 DirectX简介1.1 DOS已经过时1.2 加速DirectX1.3 加速计算机工业1.4 Directness原理1.5 Direct结构1.6 DirectX组件1.7 小结第二章基础2.1 期望什么2.2 COM(对象组件模型)入门2.3 编程经验 242.4 调试DirectX2.5 总结第三章开始使用DirectX3.1 安装3.2 文档3.3 例子程序源代码3.4 其他有用的信息3.5 使DirectX开始工作3.6 总结第一章 DirectX简介到目前为止,Microsoft Windows下的计算机游戏还没有一个辉煌的历史──它的成功还受到多媒体技术方面的限制。
Windows所提供的应用程序和PC平台之间的设备独立性使得游戏和多媒体开发者备受压力,这是因为设备独立性技术使得软件和硬件之间增添了许多中间层次,因此要想在Windows平台上生成平滑、快速的动画和紧凑、实时的输入和声音是非常困难的。
Windows的中心思想就是要把开发者和应用程序从硬件中分离出来,但这一点对于那些想直接操作硬件而获得最大速度的游戏开发者来说是致命的。
市场需要的是高性能的游戏,因此,对于那些想把Windows作为计算机游戏平台的推广者来说,“DOS!DOS!DOS!”是他们经常遇到的对DOS游戏的赞歌!1.1 DOS已经过时然而,MS-DOS也有它自已的问题,其中最棘手的是硬件设备的支持。
PC机的游戏开发者是不能享受到游戏机开发者的那种平台一致性的。
对于游戏机软件开发者,他们晚上可以睡得很香,因为白天所写的代码将在上百万台同样的机器上运行。
而PC机的开发者却不能这样,他们老是梦见新的图形协处理器、数字游戏杆、3D加速卡和实时的输入设备,他们自已也知道,在下一个游戏中将需要支持更多的硬件。
所有的PC游戏都要利用目前最好的硬件以获取最佳性能,这使得那些小游戏软件开发公司很难跟上硬件发展的步伐。
VB 中DirectX 绘图_DX 基础以及绘图设备建⽴DirectX 函数库,就是Microsoft 为开发游戏软件与⾼效率多媒体应⽤程序所开发出来的API 。
包含许多函数库模块,让以Window 系统为平台的游戏或多媒体应⽤能获得更⾼的执⾏效率、强化3D 图形成像以及丰富的声⾳效果。
同时DirectX 为程序开发⼈员提供了⼀套硬件驱动标准,不需要重新编写硬件驱动程序。
DirectX 插件:运⾏期函数库和软件开发⼯具包(SDK )组成。
⽤户执⾏DirectX 技术所开发的应⽤时,程序会调⽤DirectX 运⾏期的函数库来进⾏相关硬件的驱动控制(Win NT4.0后的操作系统都包含了运⾏期函数库)。
Win DirectX SDK 主要API 控件:Direct3D (D3D )3D 游戏开发标准,3D 图像的处理⼯作。
游戏运⾏时,需要3D 绘图,D3D 控件向显卡发出成像要求,让显卡完成图像的贴图操作。
DirectDraw 负责2D 图像处理,DX8.0以后两个绘图处理控件就合并到DirectGraphics ⾥了。
DirectSound 负责⾳频的处理,提供声卡的共同驱动标准,让应⽤程序可直接控制硬件的⾳频单元。
DirectMusic ⽀持MIDI 格式⽂件播放。
DirectShow 多媒体⽂件播放的主要控件,⽐Dsound 和Dmusic ⽀持更多媒体格式。
DirectInput 处理系统输⼊设备管理与控制,不通过操作系统直接对设备存取。
DirectPlay 8.0新加⼊负责⽹络数据传输的控制与管理。
由于9.0以后的版本仅⽀持 ,只能安装VB ⽀持的最⾼版本8.X 。
VB 中对DirectX 插件的引⽤,⼯程-引⽤-选择DirectX 8 for Visual Basic Type Library 。
DirectGraphics 中取消了2D 图像绘制的DirectDraw 控件,通过Direct3D 来进⾏所有图像的绘制操作。
目录《Direct3D编程》教学大纲(106001) (1)《互动业务系统设计》教学大纲(106002) (3)《计算机图形学》教学大纲(106003) (5)《计算机网络协议基础》教学大纲(106004) (8)《计算机组成与设计》教学大纲(106005) (11)《媒体内容安全技术》教学大纲(106006) (13)《媒体网络规划与设计》教学大纲(106007) (16)《媒体网络与交互电视技术概论》教学大纲(106008) (18)《媒体资产与业务管理技术》教学大纲(106009) (20)《面向对象程序设计—C++》教学大纲(106010) (23)《面向对象程序设计-JAVA》教学大纲(106011) (26)《面向对象程序设计-VB》教学大纲(106012) (28)《嵌入式计算机系统C》教学大纲(106013) (29)《数据库技术与SQL语言》教学大纲(106015) (34)《数字图像处理A》教学大纲(106016) (35)《数字图像处理B》教学大纲(106017) (38)《数字影视保护技术》教学大纲(106018) (40)《数字语音技术(A)》教学大纲(106019) (41)《数字语音技术(B)》教学大纲(106020) (43)《信息安全数学基础》教学大纲(106022) (45)《虚拟现实技术》教学大纲(106023) (48)《游戏测评技术》教学大纲(106024) (50)《游戏人工智能》教学大纲(106025) (51)《游戏设计基础》教学大纲(106026) (53)《游戏音效技术》教学大纲(106027) (55)《智能视频分析技术》教学大纲(106028) (57)《自然人机交互技术》教学大纲(106029) (58)《游戏引擎原理》教学大纲(106030) (60)《电子商务和信息安全》教学大纲(106031) (62)《现代电视技术》教学大纲(106032) (64)《Direct3D编程》教学大纲(106001)一、课程基本信息课程编号:106001英文名称:Direct3D Programming授课对象:数字媒体技术专业本科生开课学期:第三学年春季学期学分/学时:2学分/32学时先修课程:C语言程序设计(131002),面向对象程序设计-C++ (106010)教学方式:课堂讲授课程简介:《Direct3D》课程主要涵盖了Direct3D初始化、绘制流水线、颜色、光照、纹理、Alpha 融合、模板以及如何使用Direct3D实现游戏中所需的技术。
使用索引缓冲区绘制图形Direct3D支持通过对应于顶点集合的索引数组绘制三维图形,由于一个顶点的索引只需要用一个16位或者32位的整数表示,因此当多边形的顶点有较多重复使用时,索引数组通常能够比直接绘制顶点序列节省一部分内存空间和系统带宽。
如图3-13所示的由2个三角形组成的矩形,如果利用顶点数组表示这2个三角形,每个顶点由单精度浮点值x, y, z组成,则需要6x12=72个字节空间;如果以索引数组表示,则只需要存储4个顶点坐标和6个16位整数的索引值,只需4*12+6*2=60个字节空间。
当需要存储的三角形集合数量很多时,使用索引数组有可能节省更多的内存空间。
同时,Direct3D渲染流水线避免了对相同顶点进行重复计算,可以相应地提高图形程序的整体性能。
以顶点数组表示:( x0, y0, z0 ), ( x1, y1, z1 ), ( x2, y2, z2 )( x0, y0, z0 ), ( x2, y2, z2 ), ( x3, y3, z3 )占6*12 = 72 (bytes)以索引数组表示:( x0, y0, z0 ), ( x1, y1, z1 ), ( x2, y2, z2 ) , ( x3, y3, z3 )0, 1, 2, 0, 2, 3占4*12+6*2=60 (bytes)图1 顶点数组表示和索引数组表示索引缓冲区(Index Buffer): Direct3D用来存储多边形索引数组的内存缓冲区。
IndexBuffer.cpp定义了关于矩形的顶点数组和索引数组:// 自定义顶点结构struct CUSTOMVERTEX{ FLOAT x, y, z, rhw; // 经过坐标转换的顶点坐标DWORD color; // 顶点漫反射颜色值};CUSTOMVERTEX g_Vertices[] ={ { 0.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, //红色0{ 150.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, }, //蓝色1{ 50.0f , 250.0f, 0.5f, 1.0f, 0xff00ffff, }, //绿色2{ 100.0f, 50.0f, 0.5f, 1.0f, 0xffffffff, }, //白色3{ 200.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, //红色4{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, }, //蓝色5};WORD g_Indices[] ={0,1,2,0,3,1,3,4,1,1,4,5};IndexBuffer.cpp创建顶点缓冲区和索引缓冲区的代码如下:LPDIRECT3DVERTEXBUFFER9g_pVB = NULL; // 顶点缓冲区指针LPDIRECT3DINDEXBUFFER9 g_pIB = NULL;#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)if( FAILED( g_pd3dDevice->CreateVertexBuffer( 6*sizeof(CUSTOMVERTEX),0, D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT, &g_pVB,NULL ) ) ) {return E_FAIL;}VOID* pVertices;if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (void**)&pVertices, 0 ) ) )return E_FAIL;memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );g_pVB->Unlock();if( FAILED( g_pd3dDevice->CreateIndexBuffer( 12*sizeof(WORD),0, D3DFMT_INDEX16,D3DPOOL_DEFAULT, &g_pIB,NULL ) ) ) {return E_FAIL;}VOID* pIndices;if( FAILED( g_pIB->Lock( 0, sizeof(g_Indices), (void**)&pIndices, 0 ) ) )return E_FAIL;memcpy( pIndices, g_Indices, sizeof(g_Indices) );g_pIB->Unlock();IDirect3DDevice9::CreateIndexBuffer()为索引缓冲区创建函数,声明如下:HRESULT IDirect3DDevice9::CreateIndexBuffer(UINT Length,DWORD Usage,D3DFORMAT Fonnat,D3DPOOL Pool,IDirect3DIndexBuffer9** ppIndexBufer,HANDLE* pHandle);参数Length指明想要创建的索引缓冲区的大小,以字节数计算。