书法字典:https://www.shufadict.com

随笔分类 -  DirectX

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

posted @ 2013-09-16 09:50 翰墨小生 阅读(10698) 评论(17) 推荐(8) 编辑

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

posted @ 2013-07-10 09:22 翰墨小生 阅读(7460) 评论(26) 推荐(14) 编辑

用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 翰墨小生 阅读(10018) 评论(38) 推荐(7) 编辑

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 翰墨小生 阅读(3432) 评论(0) 推荐(1) 编辑

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 翰墨小生 阅读(2640) 评论(0) 推荐(2) 编辑

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

posted @ 2012-09-10 21:46 翰墨小生 阅读(2045) 评论(2) 推荐(0) 编辑

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 翰墨小生 阅读(3663) 评论(0) 推荐(0) 编辑

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 翰墨小生 阅读(4569) 评论(0) 推荐(1) 编辑

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 翰墨小生 阅读(3280) 评论(0) 推荐(1) 编辑

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 翰墨小生 阅读(4190) 评论(3) 推荐(2) 编辑

几何变换详解
摘要:在三维图形学中,几何变换大致分为三种,平移变换(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 翰墨小生 阅读(40866) 评论(78) 推荐(7) 编辑

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

posted @ 2012-08-02 09:19 翰墨小生 阅读(16019) 评论(19) 推荐(13) 编辑

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

posted @ 2012-07-25 08:57 翰墨小生 阅读(74564) 评论(50) 推荐(23) 编辑

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

posted @ 2012-07-21 21:32 翰墨小生 阅读(5463) 评论(7) 推荐(0) 编辑

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

posted @ 2012-07-12 09:26 翰墨小生 阅读(21796) 评论(7) 推荐(6) 编辑

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

posted @ 2012-07-09 08:57 翰墨小生 阅读(6678) 评论(12) 推荐(6) 编辑

用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 翰墨小生 阅读(3281) 评论(4) 推荐(2) 编辑

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

posted @ 2012-06-25 12:45 翰墨小生 阅读(5552) 评论(0) 推荐(2) 编辑

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

posted @ 2012-05-07 09:10 翰墨小生 阅读(5120) 评论(6) 推荐(5) 编辑

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

posted @ 2012-05-02 08:49 翰墨小生 阅读(3609) 评论(0) 推荐(5) 编辑

导航

书法字典:https://www.shufadict.com