置顶随笔

[置顶]用DirectX实现魔方(一)

摘要: 关于魔方魔方英文名字叫做Rubik's Cube,是由匈牙利建筑学教授和雕塑家Ernő Rubik于1974年发明,最初叫做Magic Cube(这大概也是中文名字的来历吧),1980年Ideal Toys公司开始销售此玩具,并将名字改为Rubik's Cube。魔方在80年代最为风靡,至今未衰。截至2009年1月,魔方在全世界已经售出了3亿五千多万个。最常见的魔方是三阶魔方,由27个小方块构成,共三层,每层9个小方块。我的Demo实现的就是三阶魔方。其他的魔方种类有二阶,四阶及更高阶,也有钻石魔方,五边形魔方,三角魔方等。三阶魔方所有可能的排列数是43252003274489阅读全文

posted @ 2013-06-28 09:18 zdd 阅读(2535) 评论(33) 编辑

2014年6月28日

Direct2D教程(外篇)环境配置

摘要: 2014年世界杯首场淘汰赛马上开始了,闲着没事,整理以前的博客草稿打发时间,意外的发现这篇文章,本来是打算加入到Direct2D那个系列的,不知道为什么把它给遗漏了。环境配置,对于熟手来说,不是什么重要的东西,但是对于新手却很重要,尤其是没有接触过Direct2D的朋友们,整理一下发了出来,没有放博...阅读全文

posted @ 2014-06-28 23:53 zdd 阅读(307) 评论(0) 编辑

2014年6月10日

链表逆序(递归法)

摘要: 来自SO,貌似没啥实际应用,但是思路不错,留存。#include #include using namespace std;struct node{ int data; node* next; node(int d, node* p):data(d), next(p){}};voi...阅读全文

posted @ 2014-06-10 16:23 zdd 阅读(145) 评论(0) 编辑

2014年5月31日

GLFW初体验

摘要: GLFW - 很遗憾,没有找到FW的确切含义,Wiki上没有,GLFW主页也没有。猜测F表示for,W表示WindowGLFW是干啥用的?一个轻量级的,开源的,跨平台的library。支持OpenGL及OpenGL ES,用来管理窗口,读取输入,处理事件等。因为OpenGL没有窗口管理的功能,所以很...阅读全文

posted @ 2014-05-31 08:42 zdd 阅读(1216) 评论(7) 编辑

2013年9月16日

用DirectX实现魔方(三)视角变换及缩放(附源码)

摘要: 在本系列第一篇介绍过鼠标按键的功能,如下。左键拖拽 - 旋转魔方右键拖拽 - 变换视角滚轮 - 缩放魔方今天研究一下如何实现后面两个功能,用到的技术主要是Arcball,Arcball是实现Model-View-Camera的重要技术,这里的旋转基于Quaternion(四元数)来实现,当然也可以通过欧拉角来实现,但是欧拉角的旋转不够平滑。先看一下Model-View-Camera的效果,如下,这个gif效果图是用LICEcap录制的,帧率有些慢,略有卡顿现象,大家可以下载文末的可执行文件查看更加平滑的效果。右键拖拽 - 变换视角由上面的动画可以看到,通过用户按下并拖拽鼠标右键即可以旋转视角(阅读全文

posted @ 2013-09-16 09:50 zdd 阅读(2054) 评论(14) 编辑

2013年7月10日

用DirectX实现魔方(二)

摘要: 这篇说一下如何构造魔方,主要包括魔方几何体的构造及纹理贴图。以下论述皆以三阶魔方为例,三阶魔方共有3 x 3 x 3 = 27个小立方体。构造魔方在第一篇里面说过,最初模型用的是微软的.x文件格式,由于魔方要实现按层旋转,所以不能将整个模型做成一个.x文件,只能分成若干个小立方体,每个立方体对应一个.x文件。这导致在发布程序的时候也要发布这些模型文件,而且.x文件已经逐渐为微软遗弃,所以就干脆不用了,自己画吧。魔方由27个小立方体构成,所以只要绘制一个小立方体,并复制27分,再将这个27个小立方体按一定顺序堆叠在一起,最后贴上纹理,就可以构成一个完整的魔方了。一个小立方体包含六个面,由于每个面阅读全文

posted @ 2013-07-10 09:22 zdd 阅读(3181) 评论(27) 编辑

2013年6月28日

用DirectX实现魔方(一)

摘要: 关于魔方魔方英文名字叫做Rubik's Cube,是由匈牙利建筑学教授和雕塑家Ernő Rubik于1974年发明,最初叫做Magic Cube(这大概也是中文名字的来历吧),1980年Ideal Toys公司开始销售此玩具,并将名字改为Rubik's Cube。魔方在80年代最为风靡,至今未衰。截至2009年1月,魔方在全世界已经售出了3亿五千多万个。最常见的魔方是三阶魔方,由27个小方块构成,共三层,每层9个小方块。我的Demo实现的就是三阶魔方。其他的魔方种类有二阶,四阶及更高阶,也有钻石魔方,五边形魔方,三角魔方等。三阶魔方所有可能的排列数是43252003274489阅读全文

posted @ 2013-06-28 09:18 zdd 阅读(2535) 评论(33) 编辑

2013年4月15日

Direct2D教程(十二)图层

摘要: 什么是Layers?Layer,中文译成图层,在Direct2D中可以用来完成一些特殊效果,使用Layer的时候,先将Layer Push到render target,然后进行绘制,此时是直接绘制在Layer上的,绘制完毕后,将Layer Pop出来,刚刚绘制在Layer上的内容就会组合到render target上。在Direct2D中,Layer使用接口ID2D1Layer来表示。和画刷一样,Layer由render target创建,属于设备相关的资源,Layer可以用于任何render target上,只要二者在相同的资源作用域内,在同一时间内,Layer只能用于一个render ta阅读全文

posted @ 2013-04-15 09:40 zdd 阅读(1910) 评论(37) 编辑

2013年4月9日

Vim案例两则

摘要: 在博问中看见两个比较典型的Vim处理文本的案例,总结一下,希望对大家有所帮助。如果大家有好的方法,欢迎讨论。尤其是第二个案例,如果能够一个命令处理更好。案例一这是在博问中看到的一个问题,原始文本如下。要求处理成下面的样子,也就是把逗号从行尾移动到下一行第一个单词前面。我的第一想法是先将2-6行的逗号删除,然后在3-7行加上逗号即可。删除2-6行的逗号:%s/,// 解释一下:: 冒号在Vim里面是命令引导符,想要输入命令必须先输入冒号。% 表示匹配所有行s/old/new/ 表示用new来替换old。s表示substitude(替换)。在s/,//中,old是逗号,new是空(注意后面两个斜线阅读全文

posted @ 2013-04-09 09:41 zdd 阅读(1137) 评论(5) 编辑

2013年3月26日

Direct2D教程(十一)几何变换

摘要: 什么是几何变换(Transform)在图形学中,主要有三种几何变换,分别是平移(Translate),旋转(Rotation)和缩放(Scaling)。在D2D中,这三种变换都有实现,而且还有一种不太常见的变换,倾斜(Skewing)。 Transform是指将一个点从一个坐标系映射到另一个坐标系,或者将一个点从同一个坐标系的一个位置映射到另外一个位置。在实际应用中,通常是将几何图形从一个位置变换到另外一个位置,而图形是由多个顶点组成的,只要将图形中的所有顶点都变换一下,那么整个图形就完成了变换,所以变换的本质是对顶点的变换。在D2D中,用如下三维矩阵M来表示这种变换。矩阵M的默认值是单位..阅读全文

posted @ 2013-03-26 09:09 zdd 阅读(2055) 评论(7) 编辑

2013年3月10日

D3D9 Device类型

摘要: D3D9主要有两种类型的Device,一种是HAL Device(Hardware Abstraction Layer,硬件抽象层)。另一种是REF Device(References Device)。HAL Device这是主要的设备类型,该类型支持硬件加速,并且支持hardware vertex processing及software vertex processing。如果显卡支持HAL类型的设备,那么在初始化D3D的时候就应该使用该类型。HAL Device只能实现大部分D3D特性,比如变换,光照,光栅化等。应用程序并不直接访问图形适配器(显卡)而是先调用D3D函数,D3D则通过HAL阅读全文

posted @ 2013-03-10 16:24 zdd 阅读(709) 评论(0) 编辑

2013年3月1日

Direct2D教程(十)绘制文本

摘要: 概述在Direct2D中,文本的绘制是通过DirectWrite来实现的,DirectWrite实际上已经是一个独立的DirectX组件了。关于DirectWrite,我摘录了MSDN的一段文字。DirectWrite介绍当今的应用程序应提供高质量的文本渲染,分辨率无关的字体及完整的Unicode文本和布局支持,DirectWrite提供了这些功能,甚至比这更多。下面是DirectWrite的特性设备无关的文本布局系统,提高了文本的可读性(包括文档及UI上的文本)高质量的,子像素,ClearType文本的渲染(可以使用GDI及Direct2D或应用程序指定的渲染技术)硬件加速的文本渲染(和Di阅读全文

posted @ 2013-03-01 09:04 zdd 阅读(2015) 评论(20) 编辑

2013年2月27日

防止Direct Input获取多次输入

摘要: 如果将Direct input处理键盘输入的函数放到游戏循环中,由于Direct Input速度极快,用户的一次按键,Direct Input将会产生多次按键事件,导致程序多次被响应,处理如下。char hitLetter = '';static bool keyPressed = false;if(dinput_->getKey()){ if(!keyPressed) { hitLetter = dinput_->getKey(); keyPressed = true; }}else{ keyPressed = false;}关键在于key...阅读全文

posted @ 2013-02-27 10:49 zdd 阅读(286) 评论(2) 编辑

Direct2D教程(九)渲染位图

摘要: 概述这篇的标题更确切的说应该叫位图画刷,这样才好和前几篇对应起来。在Direct2D中,位图的渲染也是通过画刷来实现的。Direct2D中并没有直接操作位图的接口,而是借助WIC(Windows Image Component)来完成的。今天我们来看看如何在Direct2D中加载并显示位图。这个方法可以用来渲染背景。基本步骤如下。从文件创建WIC位图由WIC位图创建D2D位图使用D2D绘制位图在开始之前,首先简要介绍一下WIC什么是WIC?WIC全称是Windows Image Component,是一套扩展的API,用来处理数字图像,它是基于COM组件的。该API包含非常丰富的图像处理函数,阅读全文

posted @ 2013-02-27 09:30 zdd 阅读(3143) 评论(40) 编辑

2013年2月21日

求反射向量

摘要: 在图形学中,计算光照模型时,经常需要求取反射向量,一般的shader函数库都提供计算反射向量的方法,下面介绍一下如何手动计算反射向量。给定入射光线向量I和平面法向量N,求反射向量R,如下图。为了方便计算,这里假定I和N都是单位向量(模为1,编程时可先将I和N单位化)方法一设入射光线向量I和反射平面的...阅读全文

posted @ 2013-02-21 21:38 zdd 阅读(1021) 评论(0) 编辑

2012年11月22日

Direct2D教程(八)梯度色画刷

摘要: 概述单色画刷产生的颜色是单一的,比如一个红色画刷只能输出红色,而渐变画刷则不同,它可以输出多种颜色,这些颜色通常是连续的,从一个颜色平滑过渡到另一个颜色,看起来有渐变的效果。渐变画刷又分为两种,一种是ID2D1LinearGradientBrush(线性渐变画刷),另一种是ID2D1RadialGradientBrush(放射渐变画刷),下图显示了这两种画刷的效果。线性渐变画刷这种画刷的颜色从一个位置线性渐变到另外一个位置,所以在创建这种画刷之前需要确定以下两个属性起始位置及颜色终止位置及颜色在Direct2D中,结构体D2D1_GRADIENT_STOP用来表示一个位置及其颜色,其定义如下:阅读全文

posted @ 2012-11-22 08:41 zdd 阅读(1601) 评论(2) 编辑

2012年11月6日

Visual Studio 2012中使用自定义project properties

摘要: 由于将系统升级到了Windows 8, 而Windows 8 SDK已经集成了DirectX SDK,且不包含DX9及之前的头文件和库文件,如果想编写DX9程序则需要安装DirectX SDK,我安装的是DirectX SDK的最后一个单独分发包-Microsoft DirectX SDK (June 2010)。这样又出现了一个问题,如果编写DX10/11或者Direct2D程序,就会导致有两份头文件及库文件,一份来自Windows 8 SDK,位于C:\Program Files\Windows Kits\8.0\Include,这是随系统安装的,而且是最新版的,编程时建议使用此版,另一份阅读全文

posted @ 2012-11-06 22:59 zdd 阅读(834) 评论(0) 编辑

2012年10月12日

DirectX11 driver类型浅析

摘要: 在DirectX 11中,创建设备时可以指定以下几种类型的driver。 D3D_DRIVER_TYPE_UNKNOWN = 0, D3D_DRIVER_TYPE_HARDWARE = ( D3D_DRIVER_TYPE_UNKNOWN + 1 ), D3D_DRIVER_TYPE_REFERENCE = ( D3D_DRIVER_TYPE_HARDWARE + 1 ), D3D_DRIVER_TYPE_NULL = ( D3D_DRIVER_TYPE_REFERENCE + 1 ), D3D_DRIVER_TYPE_SOFTWARE = ( D...阅读全文

posted @ 2012-10-12 23:58 zdd 阅读(430) 评论(0) 编辑

2012年10月2日

C++默认构造函数

摘要: 默认构造函数默认的构造函数是指为所有参数都提供了默认值的构造函数,通常是指无参的构造函数。比如下面的类Test,它的默认构造函数就是Test()。class Test{public: Test(){} // default constructor} ;如果你没有为你的类提供任何构造函数,那么编...阅读全文

posted @ 2012-10-02 15:21 zdd 阅读(708) 评论(0) 编辑

2012年9月15日

DirectWrite处理WM_SIZE消息

摘要: 对于DirectWrite程序,在窗口大小改变时,也要同步更新render target的尺寸,否则的话,所绘文本可能超出窗口之外。可以定义一个OnResize函数来更新render target的尺寸,然后再WM_SIZE中调用这个函数。// When window size changed, we need to resize the render target as wellVOID OnResize(UINT width, UINT height){ if(g_pRenderTarget) { D2D1_SIZE_U size = D2D1::SizeU(wi...阅读全文

posted @ 2012-09-15 21:36 zdd 阅读(298) 评论(0) 编辑

Direct2D中资源的创建顺序

摘要: 资源类型Direct2D中有两种类型的资源,设备无关资源和设备相关资源,设备无关的资源可以一次创建,永久使用(在程序生存期内),且通常创建于系统内存中,设备相关的资源和设备有相同的生命周期,一旦设备丢失,则资源也需重建。这类资源一般在显存中创建。设备无关的资源包括ID2D1DrawingStateBlockID2D1FactoryID2D1Geometry及继承自它的接口ID2D1GeometrySink和ID2D1SimplifiedGeometrySinkID2D1StrokeStyle设备相关的资源包括ID2D1Brush及继承自它的接口ID2D1LayerID2D1RenderTarg阅读全文

posted @ 2012-09-15 12:21 zdd 阅读(767) 评论(0) 编辑

2012年9月10日

什么是Modulate?

摘要: Modulate是颜色操作中的一个术语,可以理解为颜色乘法。两个颜色相乘,或者一个颜色与一个标量相乘。叫做modulation(调制?)。一个渲染中的三角形,其上某个像素的颜色由多个颜色源组合而成。通常来说,其中一个颜色来自纹理,另一个来自三角形顶点的插值,这两者的乘积就是最终的颜色,在这种情况下,...阅读全文

posted @ 2012-09-10 21:46 zdd 阅读(295) 评论(2) 编辑

2012年9月8日

程序员,请昂起你高贵的头!

摘要: 程序员与艺术家我这辈子最佩服两类人,一类是艺术家,一类是程序员。一个好的程序员从在某种程度上来说也是一个艺术家!艺术家是精神世界及其丰富的人群,他们不仅自己享受着艺术的魅力,也为全人类的精神文明指引着方向!程序员,他们是城市中的白领,不仅自己享受着编码的乐趣,也推动着信息世界不断向前发展。在这个信息爆炸的年代,哪个行业能离开计算机?能离开程序员?月经贴可是,就是这样艺术家一样神圣的职业,却被某些人玷污了。。。最近越来越多的人开始写一些无聊的月经贴,传播一些无聊的言论,什么程序员是青春饭,过了30就伤不起,就得转管理,程序员是苦逼行业,挣得不如民工多。相信这些类似的言论大家都不陌生吧?对于这种技阅读全文

posted @ 2012-09-08 21:12 zdd 阅读(18290) 评论(362) 编辑

XPDM vs WDDM

摘要: XPDM - Windows XP Display Driver ModelWDDM - Windows Vista Display Driver ModelSecure Desktopsecure desktop(安全桌面)在以下几种情况下被激活锁定屏幕(Windows + L)屏幕保护程序启动UAC对话框弹出当安全桌面激活时,HAL(Hardware Abstraction Layer)是不可访问的。XPDM与WDDM的不同试图创建Direct3d9 HAL device将会失败(返回D3DERR_NOT_AVAILABLE),且当前存在的D3D9 device在调用Present函数时都阅读全文

posted @ 2012-09-08 11:09 zdd 阅读(593) 评论(0) 编辑

2012年8月31日

Alpha 混合(三)Texture alpha

摘要: Texture alpha前两篇分别学习了Vertex alpha和Material alpha,今天来研究一下Texture alpha,所谓Texture alpha就是使用Texture的alpha通道进行混合,这需要texture包含alpha通道。所以首先要为texture添加alpha通道。为texture添加alpha通道使用DirectX texture tool添加一般的图片格式都是不包含alpha通道的,使用DX的texture tool可以为texture添加alpha通道,这实际上是做一次格式转换,没有alpha通道的texture格式一般是R8G8B8格式,转换后的格阅读全文

posted @ 2012-08-31 09:05 zdd 阅读(1185) 评论(0) 编辑

2012年8月27日

Alpha混合(二)Material Alpha

摘要: Alpha值Alpha混合是为了实现透明效果,透明到什么程度是由alpha值决定的,对于一个32位的ARGB格式的颜色来说,它的组成部分如下:我们可以看到,最高位的一个byte表示alpha值,它并不代表实际的颜色,它是控制颜色的百分比。范围是0x00 - 0xff,也就是十进制的0-255。它可以控制256个级别的透明程度,0表示完全透明,就是什么也看不见了。255表示完全不透明。随后的三个字节分别表示红绿蓝三原色。那么alpha值是如何工作的呢?如果开启了alpha混合,假设指定了颜色为0x80ff0000,可知alpha值为0x80(十进制128),红色=0xff(十进制255),为满色阅读全文

posted @ 2012-08-27 09:13 zdd 阅读(1155) 评论(0) 编辑

2012年8月23日

Alpha混合(一)Vertex Alpha

摘要: Vertex alphaAlpha混合通常是为了实现透明效果,透明效果的程度通过alpha值来控制,对于一个8bit的alpha chanel,可以产生0-255级透明效果,0表示完全透明,255表示完全不透明,在D3D中alpha值的来源主要有三种顶点材质纹理今天介绍如何使用顶点的alpha值来实现透明效果,为了简化程序,我们使用顶点的alpha值来控制顶点的颜色,不涉及到纹理。关于如何使用material alpha及Texture alpha将在后续的篇章中介绍。定义顶点格式我们使用Lit顶点格式,也就是无需光照,顶点本身包含颜色值,所以顶点格式如下。#define D3DFVF_CUS阅读全文

posted @ 2012-08-23 09:14 zdd 阅读(1587) 评论(2) 编辑

2012年8月10日

绕任意轴旋转

摘要: 绕坐标轴旋转关于最常见的绕坐标轴旋转,可以看看前一篇-几何变换详解。绕任意轴旋转绕任意轴旋转的情况比较复杂,主要分为两种情况,一种是平行于坐标轴的,一种是不平行于坐标轴的,对于平行于坐标轴的,我们首先将旋转轴平移至与坐标轴重合,然后进行旋转,最后再平移回去。将旋转轴平移至与坐标轴重合,对应平移操作旋转,对应操作步骤1的逆过程,对应操作 整个过程就是对于不平行于坐标轴的,可按如下方法处理。(该方法实际上涵盖了上面的情况)将旋转轴平移至原点将旋转轴旋转至YOZ平面将旋转轴旋转至于Z轴重合绕Z轴旋转θ度执行步骤3的逆过程执行步骤2的逆过程执行步骤1的逆过程假设用v1(a1, b2, c2)和v2(a阅读全文

posted @ 2012-08-10 09:20 zdd 阅读(6211) 评论(26) 编辑

2012年8月8日

几何变换详解

摘要: 在三维图形学中,几何变换大致分为三种,平移变换(Translation),缩放变换(Scaling),旋转变换(Rotation)。以下讨论皆针对DirectX,所以使用左手坐标系。平移变换将三维空间中的一个点[x, y, z, 1]移动到另外一个点[x', y', z', 1],三个坐标轴的移动分量分别为dx=Tx, dy=Ty, dz=Tz, 即x' = x + Txy' = y + Tyz' = z + Tz平移变换的矩阵如下。缩放变换将模型放大或者缩小,本质也是对模型上每个顶点进行放大和缩小(顶点坐标值变大或变小),假设变换前的点是[x,阅读全文

posted @ 2012-08-08 09:23 zdd 阅读(4158) 评论(74) 编辑

2012年8月2日

矩阵-DirectX与OpenGL的不同

摘要: 矩阵是三维图形学中不可或缺的部分,几乎所有和变换相关的操作都涉及矩阵,世界变换,视图变换,投影变换,视口变换无一不需要矩阵,但是当今的两大主流图形库DirectX和OpenGL对矩阵操作却有着细微的差别,大多数的图形学书籍都以OpenGL为基础进行阐述,游戏编程类的书籍则更多使用DirectX,这就难免产生混淆,今天这篇主要讲讲两者在操作矩阵的时候有何不同。矩阵在三维图形学中,一般使用四维矩阵,也就是四行四列的方阵,下面是一个典型的四维矩阵既然是三维图形学,为什么使用四维矩阵呢?主要有两个原因,第一,为了平移变换,第二,为了区别点和向量。行向量与列向量对于一个四维向量,它是行向量还是列向量呢?阅读全文

posted @ 2012-08-02 09:19 zdd 阅读(3179) 评论(19) 编辑

2012年7月25日

透视投影详解

摘要: 概述投影变换完成的是如何将三维模型显示到二维视口上,这是一个三维到二维的过程。你可以将投影变换看作是调整照相机的焦距,它模拟了为照相机选择镜头的过程。投影变换是所有变换中最复杂的一个。视锥体视锥体是一个三维体,他的位置和摄像机相关,视锥体的形状决定了模型如何从camera space投影到屏幕上。最常见的投影类型-透视投影,使得离摄像机近的物体投影后较大,而离摄像机较远的物体投影后较小。透视投影使用棱锥作为视锥体,摄像机位于棱锥的椎顶。该棱锥被前后两个平面截断,形成一个棱台,叫做View Frustum,只有位于Frustum内部的模型才是可见的。透视投影的目的透视投影的目的就是将上面的棱台转阅读全文

posted @ 2012-07-25 08:57 zdd 阅读(5326) 评论(23) 编辑

2012年7月21日

DirectX Triangle Strips

摘要: 今天北京下了一天的雨,而且是暴雨,不知道又有多少地方可以划船了,这么大的雨也打乱了我的搬家计划,不能搬家,那就写一篇小文吧,也是刚才没事浏览DX SDK文档时偶有所悟,非常简单,博大家一笑而。Triangle Strips是D3D用来绘制三角形的一种方式,这种方式比Triangle list更加高效,因为不用重复存储三角形顶点。下面看一个例子,分析一下这两种方式的不同。现在我们要绘制一个矩形,在D3D中,最基本的几何图元是三角形,所以可用两个三角形拼接成一个矩形,如下图。使用Triangle list绘制triangle list的工作方式是每次取三个顶点作为一组,绘制一个三角形。如果有n个三阅读全文

posted @ 2012-07-21 21:32 zdd 阅读(1313) 评论(7) 编辑

2012年7月19日

【转载】DirectX支配游戏!历代GPU架构全解析

摘要: 原文链接http://www.pcpop.com/doc/0/521/521833.shtml泡泡网显卡频道4月30日NVIDIA与ATI(AMD)的GPU之战,远比Intel和AMD的CPU之战有意思,毕竟双方的实力差距并没有那么悬殊,经常斗得是难解难分。N/A的连年征战给我们带来无与伦比游戏画面和优秀产品的同时,也为喜欢IT技术的朋友带来了许多乐趣和谈资,只有深爱硬件技术的朋友才能有所体会。 掐指一算,从GPU诞生至今双方都已推出了十代产品,每一代产品之间的对决都令无数玩家心动不已,而其中最精彩的战役往往在微软DirectX API版本更新时出现。虽说胜败乃兵家常事,但NVIDIA和ATI阅读全文

posted @ 2012-07-19 14:14 zdd 阅读(355) 评论(0) 编辑

2012年7月12日

View Transform(视图变换)详解

摘要: 什么是View Transform我们可以用照相机的原理来阐释3D图形的绘制过程,想象一下,我们在摄影的时候都需要做哪些工作,大致可分为如下几个步骤摆放好待拍摄的物品,或者人物。调整好拍摄角度。调整焦距。拍摄。好了,来分析一下,上面的第一步就相当于世界变换了,将一个模型置于一个公认的坐标系中,这里所谓的公认,也就是大家都遵守的,目的是保证待拍摄的物体和照相机在同一个坐标系。第二步相当于视图变换,这个过程是调整Camera到合适的位置以便拍摄,在3D程序中,也就是设置View Matrix了。第三步调整焦距,这就相当于3D编程中的投影变换。View Transform的过程就是在世界坐标系中摆放阅读全文

posted @ 2012-07-12 09:26 zdd 阅读(2936) 评论(5) 编辑

2012年7月9日

用DirectX实现粒子系统(三)

摘要: 引言上一篇讲了如何在DirectX中使用点精灵,这篇再扩展一下,讲讲如何实现一个完整的粒子系统效果-烟花。任何一种复杂的现象都可以拆分为若干独立的小单元,烟花也是如此,一个绚丽的烟花无非是若干小粒子按照一定的顺序,一定的速度,颜色及存活时间组合而成的。烟花的种类成千上万,不同的烟花有不同的效果,我们今天主要讲述爆炸效果。先来几张效果图吧,如下。前面说了,一个复杂的现象是由若干个基本单元构成的,所以,我们最先定义这个基本单元-粒子,一个粒子主要有哪些属性呢?由上面的图可知,首先粒子是有颜色的,上面一共有白,红,黄,绿四种颜色的粒子。其次,粒子是有大小的,只有大小不同的粒子相互组合才能构成特殊的渐阅读全文

posted @ 2012-07-09 08:57 zdd 阅读(2122) 评论(10) 编辑

2012年6月27日

用DirectX实现粒子系统(二)

摘要: 引言上一篇讲了点精灵的理论部分,这篇看一下如何在DX程序中使用点精灵。定义顶点格式为了简化程序,我们使用LT(Lit and transformed format)顶点格式,也就是不需要额外的光照和变换。// 点精灵对应的顶点struct POINTVERTEX{ float x, y, z ; // 位置 D3DCOLOR color; // 颜色};// 点的格式是经过光照和变换的,无需设置光照和变换矩阵#define D3DFVF_POINTVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)创建顶点及顶点缓冲区这里首先创建九个顶点,每行三个,三行...阅读全文

posted @ 2012-06-27 08:52 zdd 阅读(1505) 评论(4) 编辑

2012年6月25日

用DirectX实现粒子系统(一)

摘要: 引言Point sprites,中文译成点精灵,是粒子系统的基础,本篇主要介绍point sprites的相关知识,为后续的粒子系统做准备。Point Sprites(点精灵)Point sprites是DirectX8中引入的一个新特性,主要是用来高效渲染粒子系统,使用point sprites做为底层数据结构,表示层配以纹理,可以呈现出任意形状的粒子。粒子系统应用十分广泛,可以用来模拟许多特殊效果,比如常见的爆炸,烟雾,火焰等,都可以用粒子系统实现。point sprites不支持固定的几何管线,只能使用可编程的顶点处理程序。Point Primitive Rendering Contro阅读全文

posted @ 2012-06-25 12:45 zdd 阅读(2284) 评论(0) 编辑

2012年5月7日

DirectX怪象之二, 程序很吃CPU

摘要: 学习DirectX编程的兄弟们可能经常遇到的一个情况是,程序经常莫名奇妙的占用大量的CPU资源,其实吃CPU的问题并不是DirectX程序所特有的,几乎任何程序都可能,只不过DirectX程序更加容易产生而已,总结了一下,主要有以下几个方面没有及时释放资源这种情况的现象多发生在程序运行的时候,也就是窗口处于active状态时,大家都知道,DX是基于COM的,这也就意味着,你需要手动释放COM对象,如果没有及时释放的话,CPU就会吃紧,尤其是当在Render函数中创建对象的时候更是如此。至于哪些需要释放,哪些不需要释放,需要视具体情况而定,这里有一个简单的方法,如果创建该对象的函数形如Creat阅读全文

posted @ 2012-05-07 09:10 zdd 阅读(2688) 评论(6) 编辑

2012年5月2日

DirectX怪像之一,我的模型不见了

摘要: 引言对于刚刚编写DirectX程序的朋友来说,经常遇到的一个问题就是,风风火火写了一大堆代码,编译-运行!哇塞,窗口里黑乎乎一片,啥也没有,或者是之前运行好好的程序,不只修改了哪里,导致以前渲染的画面现在都没有了。我在学习的过程中也经常遇到这种问题,索性总结下来,与大家分享。希望能给刚入门的兄弟们一个提醒。场景为何消失?根据我自己的经验,如果渲染场景中某些东西不见了,一般有以下几个主要的原因光照设置不正确很简单,在一个伸手不见五指的黑夜里,你能指望看见什么呢?光照是D3D中必不可少的东西,用来计算顶点的最终颜色。但是并不是所有的顶点格式都需要光照,有些定点格式,如果设置了光照反而会导致模型无法阅读全文

posted @ 2012-05-02 08:49 zdd 阅读(2035) 评论(0) 编辑

2012年4月3日

DirectX截图黑屏的解决办法

摘要: 好久没有更新博客了,今天开始继续耕耘。生活要继续工作要继续梦想也一定要继续!之前写过一篇关于DirectX截屏的文章,其中有网友留言提到了截图黑屏的问题,于是这些日子研究了一下,与大家一同分享。为什么会黑屏?一句话概括,黑屏是由于DDraw加速引起的!先说一下DirectX的显示原理,通常我们看到的屏幕上的数据,都是通过Primary Surface送至显示器的,什么是Primary Surface呢?中文叫做主显示表面,也就是说我们当前看到的屏幕上的图像数据是从这个表面来的,除了主表面意外还有离屏表面,叫做OffScreenSuface。这种表面中的数据是不直接显示在屏幕上的。常用的截屏函数阅读全文

posted @ 2012-04-03 08:38 zdd 阅读(7203) 评论(4) 编辑

2011年9月15日

也谈走台阶问题

摘要: 问题刚才在首页看到一篇博客,说的是腾讯的一道面试题:一个楼梯有50个台阶,每一步可以走一个台阶,也可以走两个台阶,请问走完这个楼梯共有多少种方法?博主把这题分析的很麻烦。引来很多人围观。我以前也碰到过这个问题。写出来和大家分享一下。举个例子,假设有3个台阶,则有三种走法:分别是,1-1-1, 1-2, 2-1。分析很简单的一道题,学过组合数学的人很快就能想到,这是一个递推关系。假设走完k个台阶有f(k)种走法。k = 1时,f(k) = 1k = 2时,f(k) = 2k = n时,第一步走一个台阶,剩n-1个台阶,有f(n - 1)种走法。第一步走两个台阶,剩n-2个台阶,有f(n - 2)阅读全文

posted @ 2011-09-15 14:23 zdd 阅读(2395) 评论(23) 编辑

导航

公告