随笔分类 -  D3D

摘要:平面是一个无限扩展的区域。读者可以将其形象化为沿着上下两个方向无限扩展的平面墙。如果很难理解平面这个概念,那么试着考虑一下宇宙。想象一样,宇宙非常平而且沿着所有其他边不断无限扩展的情况。虽然屏幕区域有限,但可以在屏幕上绘制平面,因为只要对有限数量的像素做阴影处理即可。然而,在Direct3D和OpenGL中并没有内置渲染平面的方法。所以,如果不能渲染平面,那就会出现问题,即平面到底对谁有好处?关于这个问题,答案有很多。最常见的一个答案就是几何图形选择和碰撞检测有了几何图形选择,就可以创建一个平面或一系列平面,而这取决于几何图形位于平面的哪一侧,并可以快速确定是否需要绘制该对象。因为这可以很大程 阅读全文
posted @ 2011-09-11 11:48 小 楼 一 夜 听 春 雨 阅读(748) 评论(0) 推荐(0)
摘要:矢量是游戏开发中涉及到的最基本的对象。矢量有多种形式,可以是2D、3D或4D等。3D矢量是一个包含3个浮点数的结构,每个值代表矢量中不同的轴。这些值分别是x、y和z轴,可用于描述三维空间。矢量用于描述3D空间中的方向,它可能也是最常用的数学对象。矩阵是游戏开发中第二个最常用的数学对象。矩阵主要用于将矢量从一个坐标系转换到另一个坐标系,还可用于旋转和平移。矩阵由浮点数的2D数组组成。3×3矩阵由3行、3列共9个元素组成,4×4矩阵是由4行、4列共16个浮点元素组成的2D数组。四元组用于描述旋转。四元组是由4个浮点数w、x、y、z构成的结构,像4D矢量。虽然矩阵也可用于旋转,但 阅读全文
posted @ 2011-09-11 02:40 小 楼 一 夜 听 春 雨 阅读(1170) 评论(0) 推荐(1)
摘要:实际上根据为引擎添加脚本支持的要求,目前要做的工作是将本章创建的文件复制到Stranded引擎的文件夹中。这些文件分别是CommandScript.h、CommandScript.cpp、PropertyScript.h、PropertyScript.cpp、Token.h和Token.cpp。每个类都可以独立工作,所以转换工作就非常简单。 阅读全文
posted @ 2011-09-10 18:47 小 楼 一 夜 听 春 雨 阅读(287) 评论(0) 推荐(0)
摘要:文件是由分开的不同文本块组成的。这些文本可用作命令、属性名称、字符串、数字等。所使用的这些内容有一个共同点,即它们是用分隔符分开的。分开的每一组文本称为一个令牌。文件可以由许多令牌组成,每个令牌都有自己的用途和含义。在不考虑出现令牌原因的情况下,令牌只是一些文本。如果愿意的话,有时可以将文件分隔成一系列令牌——令牌流——这是一种很好的做法。如果读者曾经研究过更高级类型的脚本,实际上就会发现这只是为了将脚本编译成一种更低级形式而要做的一些工作。也许在创建命令和属性脚本系统时,已经使用过令牌流。虽然有一种获取信息的方法,但如果本该使用令牌流而没有使用,那么这个方法就不是很清晰。例如,对属性脚本而言 阅读全文
posted @ 2011-09-10 16:37 小 楼 一 夜 听 春 雨 阅读(803) 评论(0) 推荐(1)
摘要:命令脚本是一种在文件中包含许多命令的脚本。命令脚本和属性脚本非常相似,除了每一行第一个单词所代表的意思不同之外。在基于命令的脚本中,通常要有一个文件,并且会解释该文件,直到文件执行到结束或是出现错误为止。伪代码:Open the script file and get the line count.Create an array of strings for each line.In the application loop through each line.Get the command and check if it is invalid or a comment.if valid, g 阅读全文
posted @ 2011-09-10 12:39 小 楼 一 夜 听 春 雨 阅读(332) 评论(0) 推荐(0)
摘要:script.spt# This is an example of a comment.teapotColor 0.0 0.0 1.0cameraPosition 0.0 0.0 -5.0# These are not used but are here to test loading strings and ints.totalTeapots 1description This just a teapot in a 3D scene! PropertyScript.h#ifndef _UGP_PROPERTY_SCRIPT_H_#define _UGP_PROPERTY_SCRIPT_H_. 阅读全文
posted @ 2011-09-10 00:17 小 楼 一 夜 听 春 雨 阅读(369) 评论(0) 推荐(0)
摘要:为了启动项目,这里将在defines.h文件中为想要在引擎中使用的雾和多采样功能添加几个define语句。对雾而言,将使用想要创建的雾的枚举类型。对多采样而言,将使用可以支持的多采样枚举类型。对该引擎而言,这里将支持非多采样、2倍、4倍、8倍和16倍速率采样等几种采样类型。雾枚举类型的名称是UGP_FOG_TYPE,而多采样枚举类型的名称是UGP_MS_TYPE。更新后的defines.h文件如程序清单6.15所示。注意在defines.h文件末尾处添加枚举类型,由于该文件的其他内容已经介绍过,因此这里没有列出。程序清单6.15 更新后的defines.h头文件#ifndef _UGP_DEF 阅读全文
posted @ 2011-09-06 20:40 小 楼 一 夜 听 春 雨 阅读(529) 评论(1) 推荐(0)
摘要:粒子系统保存和操纵一种称为粒子的元素。粒子系统的职责就是对粒子施加不同的作用力,为它们增加一种真实的外观。粒子系统的类型包括爆炸、烟、火、火花等,而其他类型的效果可由许多小的元素构成。粒子是一个小物体,包含多种属性,如位置、速度(方向)和质量。游戏中,粒子通常是添加了纹理的小正方形,通常面向摄象机。在实现点状sprite时已经介绍过这一点。点状sprite可以由粒子系统使用,从而有效地生成多种不同的效果。粒子系统示例如图6.5所示。通常,粒子相互之间独立作用,但却限制在粒子系统范围内。例如,所有的粒子也许从相同位置开始或从比较接近的位置开始,但它们都有自己的属性,将彼此分隔开。同样,通常在游戏 阅读全文
posted @ 2011-09-05 20:36 小 楼 一 夜 听 春 雨 阅读(750) 评论(0) 推荐(0)
摘要:通常会多次要在3D场景中显示大量的细节。例如,混凝土上的裂纹,或粗糙墙面的凸凹不平之处。也许并不总是想在纹理图像自身包含这种细节。通常,一些彩色图纹理虽然从远处看的时候它们很好,但靠近看时,也许会让观察者觉得有些模糊。使用一种名为细节映射的技术有助于解决这些问题,或至少得到改善。细节图是一个灰度图,保存小而精确的细节内容。当将其和颜色图一起施加到表面上时,最终的图像看上去原始图像好像有更多的细节。同样,使用细节图时,颜色图在从上靠近看时,看上去不模糊。使用细节图为表面增加细节,给图增加小的裂纹以及线条,这样可以提高表面的真实感。对墙和类似表面更是如此。细节映射的演示成名为DetailMappi 阅读全文
posted @ 2011-09-05 14:13 小 楼 一 夜 听 春 雨 阅读(349) 评论(0) 推荐(0)
摘要:为3D场景增加雾会得到更真实的渲染效果。雾可以增加大量真实感,尤其对地形、树林地区以及幽灵般的户外背景。同样,雾可以很好地限制观察者对环境的可见度。现实中并不存在无限的视觉距离。事实上,这就是虚拟环境的一个镜像。通过限制观察距离,同样可以限制发送给管道的多边形数目。这对于提高渲染时间更有用。如果读者还记得PS游戏机上的第一个游戏《寂静岭》(Silient Hill),该游戏物景中有许多雾,很难看到外面的事物,除非是事物就在游戏玩家的面前,就可以很清楚地了解这一点。Direct3D中有两类硬件雾可用:顶点雾和像素雾。顶点雾是按照每个顶点来计算雾的数据,而像素雾根据像素级别计算雾的数据。由于通常像 阅读全文
posted @ 2011-09-04 22:54 小 楼 一 夜 听 春 雨 阅读(1799) 评论(1) 推荐(0)
摘要:1 多采样 (抗锯齿)全景抗混叠是一种减少在渲染多边形的边时所产生的参差不齐效果的方法。抗混叠物体也会对渲染后的整个场景产生负面影响,尤其是处理动画更是如此。通过实现对像素的本地模糊处理,并在屏幕上显示出一个平均结果而实现全景抗混叠。在Direct3D中启用多采样将实现程序中的抗混叠。多采样将对程序性能的影响很大。这种性能影响取决于所选的样本数,所以在考虑更多的样本数时,一定要牢记这一点。采样数越高,渲染的场景质量就越好。样本最大数取决于支持它的硬件。某些硬件根本不支持多采样,而有一些硬件也许可以支持多大4倍速率的采样,还有一些可以支持8倍速率或更高的采样率。在Direct3D 9.0中,多采 阅读全文
posted @ 2011-09-04 21:40 小 楼 一 夜 听 春 雨 阅读(2127) 评论(0) 推荐(0)
摘要:main.h头文件包含了用于GUI系统和控件的define语句。这里将在游戏源文件中添加3个新函数,它们分别是InitializeMainMenu()、MainMenuCallback()和MainMenuRender()。其中InitializeMainMenu()由GameInitialize()函数调用,将整个GUI的主菜单加载到内存中。MainMenuRender()由GameLoop()函数调用,借助渲染系统将主菜单显示在屏幕上。函数MainMenuCallback()是GUI系统的回调函数,对按钮动作做出响应。main.h#ifndef _UGP_MAIN_H_#define _U 阅读全文
posted @ 2011-09-02 18:22 小 楼 一 夜 听 春 雨 阅读(692) 评论(0) 推荐(0)
摘要:GUI系统将主要由按钮和静态文本控件对象构成。同样,可以指定和按钮、文本一起显示的背景图。GUI系统是2D的。这意味着指定对象位置时,用不到Z轴。另外,使用正交投影方式渲染GUI,这样可以根据像素位置指定屏幕位置,而不是使用标准单位来指定屏幕位置。回忆一下(0,0)对应的是屏幕的左上角。在Windows系统中,左上角同样是(0,0)。有了该信息,就可以轻松地确定玩家的鼠标指针是否在要创建的GUI系统的控件上或是正在按该控件。只要在规划按钮和文本位置时,记得左上角是(0,0),就能创建任何限制在系统范围内的GUI。当涉及到背景图时,没必要考虑它的位置,因为该图像是一个由两个三角形构成的全屏图像。 阅读全文
posted @ 2011-09-01 21:31 小 楼 一 夜 听 春 雨 阅读(831) 评论(0) 推荐(0)
摘要:// FPS info.// FPS相关变量int g_fps = 0; // FPS帧率值char g_fpsStr[16] = {0}; // 存放帧率值float g_time = 0.0f; // 系统运行时间float g_lastTime = 0.0f; // 持续的时间// 计算帧率void GetFPS(){ // Get the second in millisecond then multiply it to convert to seconds. // g_time获取操作系统启动到现在所经过的毫秒数,乘以0.001f得... 阅读全文
posted @ 2011-08-30 23:06 小 楼 一 夜 听 春 雨 阅读(1833) 评论(0) 推荐(0)
摘要:为了在一个基本层次上显示文本,要用到两个不同的对象,即LPD3DXFONT和RECT这两个结构。LPD3DXFONT用于创建和显示文本,而RECT用于确定要显示的文本位置。为了创建LPD3DXFONT对象,就要用到一个名为D3DXCreateFont()的函数。该函数原型如程序清单5.1所示。其成员变量如下:■ Height:字体字符的高度■ Width:字体字符的宽度■ Weight:打印字体的权重(即:粗体)■ MipLevels:文本的Mipmap级别■ Italic:字体是否为斜体■ Charset:用到的字符集■ OutputPrecision:指定Windows与期望字体大小的匹配 阅读全文
posted @ 2011-08-30 15:29 小 楼 一 夜 听 春 雨 阅读(3712) 评论(0) 推荐(1)
摘要:24.的程序代码源于书籍附带光盘,运行得不到正确结果,由于bool InitializeObjects(),void RenderScene()这2个函数中的代码所致。先看这2个函数,原来的代码如下:bool InitializeObjects(){ // Setup the g_Light source. g_Light.Type = D3DLIGHT_DIRECTIONAL; g_Light.Direction = D3DXVECTOR3(0.0f, 0.0f, 1.0f); g_Light.Diffuse.r = 1; g_Light.Diffuse.g =... 阅读全文
posted @ 2011-08-30 14:59 小 楼 一 夜 听 春 雨 阅读(621) 评论(0) 推荐(0)
摘要:main.h main.cpp 无变化define.h#ifndef _UGP_DEFINES_H_#define _UGP_DEFINES_H_#include<windows.h>// Boolean values.#define UGP_INVALID -1#define UGP_OK 1#define UGP_FAIL 0// Light type defines.#define LIGHT_POINT 1#define LIGHT_DIRECTIONAL 2#define LIGHT_SPOT 3// Window handle (... 阅读全文
posted @ 2011-08-30 11:27 小 楼 一 夜 听 春 雨 阅读(990) 评论(0) 推荐(0)
摘要:游戏中应用的例子:游戏中打开观察人物的界面,UI上显示的人物就是通过这种方式绘制出来的。渲染到纹理是D3D中的一项高级技术。一方面,它很简单,另一方面它很强大并能产生很多特殊效果。 比如说发光效果,环境映射,阴影映射,都可以通过它来实现。渲染到纹理只是渲染到表面的一个延伸。我们只需再加些东西就可以了。首先,我们要创造一个纹理,并且做好一些防范措施。第二步我们就可以把适当的场景渲染到我们创建的纹理上了。然后,我们把这个纹理用在最后的渲染上。 ?main.cpp 首先我们得声明所需要的对象。当然我们需要一张用来渲染的纹理。此外,我们还需要两个Surface对象。一个是用来存储后台缓冲区,一个用.. 阅读全文
posted @ 2011-08-29 20:31 小 楼 一 夜 听 春 雨 阅读(2596) 评论(0) 推荐(1)
摘要:此两个参数有2个函数用到:HRESULT CreateDepthStencilSurface( UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, BOOL Discard, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle);的第四个参数。HRESULT D3DXCreateTexture( LPDIRECT3DDEVICE9 pDevice, UINT Width,... 阅读全文
posted @ 2011-08-29 20:29 小 楼 一 夜 听 春 雨 阅读(1159) 评论(0) 推荐(0)
摘要:修改view矩阵,例如:D3DXMATRIX g_ViewMatrix;float g_RotationAngle = 0.0f;g_RotationAngle += 0.0002f;if(g_RotationAngle >= 360) g_RotationAngle = 0.0f;D3DXMATRIXA16 w;D3DXMatrixRotationY(&w, g_RotationAngle);g_ViewMatrix *= w;g_D3DDevice->SetTransform(D3DTS_VIEW, &g_ViewMatrix);也就是眼睛摄像机的位置不停地绕着 阅读全文
posted @ 2011-08-29 10:03 小 楼 一 夜 听 春 雨 阅读(588) 评论(0) 推荐(0)