- 博客(34)
- 资源 (21)
- 收藏
- 关注
原创 【D3D11游戏编程】学习笔记二十五:法线映射(Normal Mapping)
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 1. 为什么使用法线映射? 在开始正式讨论法线映射之前,先来看下以下两张图片: 这两张依然是之前一篇文章中用到的仙剑五前传中两张截图,两图中显示的为同一地点
2013-03-12 08:13:55 22291 27
原创 【D3D11游戏编程】学习笔记二十四:切线空间(Tangent Space)
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 切换空间,同局部空间、世界空间等一样,是3D图形学中众多的坐标系之一。切换空间最重要的用途之一,即法线映射(Normal Mapping)。关于法线映射的细节,将在下一篇文章中详细介绍。但在学习法线映射之前,深
2013-02-28 00:29:33 44737 14
原创 【D3D11游戏编程】学习笔记二十三:Cube Mapping进阶之动态环境图
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 在前面两篇介绍Cube Mapping的文章中,我们所使用到的Cube Map都是事先制作好的,这样的一个好处就是运行时效率很高,适合于大多数情形。但如果对于即时动态变化的场景来说,依靠静态图来实现反射效果就不再
2013-02-24 07:53:45 18323 6
原创 【D3D11游戏编程】学习笔记二十二:Cube Mapping应用之二:反射的实现
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) Cube Mapping应用非常广泛,除了上节中介绍的用来实现天空盒之外,另一个很常见的用途就是实现不规则物体表面的反射效果。 在前面的一篇文章中介绍过平面镜反射的基本原理及d3d11的实现。对于
2013-02-16 07:59:47 11798 6
原创 【D3D11游戏编程】学习笔记二十一:Cube Mapping及其应用之一:天空盒的实现
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 这一节讨论有关纹理映射的进阶内容:Cube Mapping。 1. 简介 单从名字上,就大概可以看出点端倪了,翻译成中文为立方体映射,因此肯定跟立方体有关系。确实,Cube Mappi
2013-02-13 08:17:28 14457 6
原创 【仙剑五前传】中的一点场景渲染问题
(注:本文由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 两周时间没来CSDN更新博客,业余时间主要花在新上市的《仙剑奇侠传五-前传》上了~ 不可否认,仙剑系列作为国产单机游戏的第一品牌,当之无愧。尽管当年的仙剑五让很多人大为失望,不过相信通过这次的五前,相信大部分玩家会以新的眼光来看
2013-02-05 06:33:51 17794 34
原创 【D3D11游戏编程】学习笔记二十:第一人称摄像机的实现
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 在这篇文章中,我们来实现一个简单的第一个称摄像机。在之前所有的程序中,为了方便从各个角度观察场景,我们可以通过鼠标来旋转视角和镜头远近。尽管相对单一地从固定的角度观察方便多了,但观察点依然仅仅限制在一个球面上,观察目标点
2013-01-20 05:50:32 20313 12
原创 【D3D11游戏编程】学习笔记十九:平面阴影的渲染
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 在这一篇文章中,我们讨论的话题依然是模板缓冲区,这次通过另一个十分常见的例子:阴影,继续来感受一下模板缓冲区灵活的用法。 阴影的渲染是个很高级的话题,当然,我们这次仅仅讨论平面阴影,即光源照射物体在平
2013-01-16 06:58:43 9963 2
原创 【D3D11游戏编程】学习笔记十八:模板缓冲区的使用、镜子的实现
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 模板缓冲区(Stencil Buffer)是一个与后缓冲区(Back Buffer)尺寸一样的离屏缓冲区(Off-Screen Buffer),主要用于实现一些特效。模板缓冲区中的每一个像素Pi,j,与后缓冲区中的像素
2013-01-14 02:40:34 21249 12
原创 【D3D11游戏编程】学习笔记十七:雾效的实现
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 雾效是3D渲染中用来模拟现实中大气现象的一种常见手段。最直接的用途就是实现带雾天气的场景。此外,雾效还有其他很多重要的作用: 1. 用来防止场景中远处物体的突然消失/出现(popping)。这种现象的主
2013-01-10 04:19:59 9133 7
原创 【D3D11游戏编程】学习笔记十六:Alpha通道(Alpha Channel)
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 在使用纹理时,我们有时需要指定该纹理图哪些部分是我们想要的,哪些部分我们不需要,即透明的。这时候,我们需要为纹理的每个texel指定alpha值,令我们不需要的那些部分的alpha为0,其他部分为1。纹理中对
2013-01-02 07:23:27 10441 9
原创 【D3D11游戏编程】学习笔记十五:混合(Blending)
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 在D3D11中,“混合”发生在像素着色器阶段的下一阶段,即Output Merger Stage。整个场景在全部经历过像素着色器阶段后,对应于屏幕上每一点像素,可能有多个片段(Fragment)。如下
2012-12-31 06:28:52 13171 6
原创 【D3D11游戏编程】学习笔记十四:纹理基础
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 光照和材质的加入使得场景的真实感大大增加,但仅仅这些依然不足以表现出真实世界中物体表面的各种细节。毕竟,材质所能够提供的细节等级仅仅停留在顶点级别上。纹理的引入,使得在像素级别上提供细节成为可能,因而可以进一步大大提高
2012-12-29 03:17:45 15133 22
原创 【D3D11游戏编程】学习笔记十三:内存对齐的一点思考
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 不知你是否还有印象,在上一篇中提到三种光源的结构体时,无论是C++中的定义还是HLSL中的定义,都存在着名为"unused"的成员(平行光和点光源)。如下为C++程序中对平行光的定义: //平行光 struct
2012-12-27 23:02:09 9101 3
原创 【D3D11游戏编程】学习笔记十二:光照模型
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 从这一篇开始,我们逐渐进入D3D11中有意思的部分。之前的场景绘制,要么为每个顶点指定单一的颜色,要么在线框模式下渲染。从现在起我们开始学习光照,这样场景就更加具有真实感了。 1. 法线的引入
2012-12-25 06:05:48 18144 12
原创 【D3D11游戏编程】学习笔记十一:基本几何体绘制
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 这次我们来学习几种常见的基本几何体的绘制方法,包含网格、球、圆柱等。很多复杂的几何图形都是由众多这些基本几何体组成的。而且,在水面渲染、地形渲染当中,都要使用到网格,因此掌握网格的基本生成方法很有必要。此外,有了这么多
2012-12-23 22:40:21 13565 13
原创 【D3D11游戏编程】学习笔记十:程序框架
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 从上次绘制一个简单立方体的例子中,我们可以发现,即使是一个十分简单的程序,其代码长度也是相当的长。但实际上,大多数代码只是用于了Win32、D3D11的初始化,剩下的才是我们真正关心的绘制代码。一方面,这些代码妨碍我们
2012-12-22 23:21:54 9573 5
原创 【D3D11游戏编程】学习笔记九:编译Effect的方法
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 在D3D11应用程序中,对于写好的Effect程序进行编译有如下几种常见方法: 1. 在运行期编译 用这种方法,我们只管写好Effect代码即可,不用关心其编译问题,而是在C++程序中,通
2012-12-18 02:46:05 13298 4
原创 【D3D11游戏编程】学习笔记八:绘图基础-旋转的彩色立方体
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 历代的D3D教程中,介绍基本绘图时都会拿立方体作为例子,这次也不例外~ 立方体虽然简单,但正所谓麻雀虽小,五脏俱全。绘制立方体的过程其实已经包含了所有D3D渲染程序中最基本的、必不可少的步骤。因此,从绘制立方体开始学习
2012-12-16 09:34:38 15675 21
原创 【D3D11游戏编程】学习笔记七:3D渲染管线
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 3D图形学研究的基本内容,即给定场景的描述,包括各个物体的材质、纹理、坐标等,照相机的位置及朝向,光源等信息,计算其最终在二维的光栅化显示器上对应的显示结果。从最初的场景描述到最终的显示结果,这整个过程就是在3D渲染
2012-12-15 07:32:58 14757 2
原创 【D3D11游戏编程】学习笔记六:定时器的实现
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 无论在游戏还是简单的动画程序当中,定时器是一个必不可少的元素,用来正确地控制游戏帧数、动画的播放。最简单的实现定时器的方法通过在主循环中定义两个静态计时用的变量即可实现。但在学习过程中,定时器的使用相当频繁,因此设计
2012-12-13 22:42:34 8341 3
原创 【D3D11游戏编程】学习笔记五:D3D11初始化
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 初次使用D3D11,先从它的初始化开始。不过在使用D3D之前,需要了解几个重要的概念: 1. 硬件能力:Hardware Capacity 熟悉D3D9的会很清楚,在初始化d3d9的一
2012-12-13 18:06:15 22818 19
原创 【D3D11游戏编程】学习笔记四:准备工作
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 现在可以开始接触D3D了,但是在开始前,还有一小部分准备工作要做,即配置开发环境。 配置环境相当简单,属于一劳永逸那种。接触过游戏编程的同学绝大多数应该很熟悉这个步骤了,但为了保证一致,防止后面学习过
2012-12-12 05:37:07 11883 9
原创 【D3D11游戏编程】学习笔记三:XNAMath之XMMATRIX
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 在熟悉了XMVECTOR的风格及规则之后,再来了XNA数学库中的矩阵就容易得多了。基本上可以跟向量相类比。 一、 矩阵类型 XNA数学库中针对矩阵的类型为XMMATRIX。这是一个4x
2012-12-11 05:35:14 11800
原创 【D3D11游戏编程】学习笔记二:XNAMath之XMVECTOR
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 一、XNA Math简介 在D3D10及之前的版本中,3D数学库是伴随在D3DX库中的。在D3D11版中,3D数学库被单独隔离出来,为XNA Math库,功能和之前基本一样,但是建立在SIMD指令上,
2012-12-11 02:55:01 14800 11
原创 【D3D11游戏编程】学习笔记一:最新版D3D11龙书
(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 前一段时间破费从美国Amazon上买到了一直梦寐以求的游戏编程方面的书,其中包括介绍Direct3D方面最经典的“龙书”:《Introduction to 3D Game Programming with Direc
2012-12-10 22:39:56 21264 16
原创 用const、enum、inline替代#define
在C语言程序设计中,define被大量地使用,用来定义常量或者宏,以减少代码重复及提高可维护性。但在C++中,引进了const、enum、inline后,大多数使用define的地方都可以用它们来代替(当然#ifndef、#define、#endif这种条件编译除外)。以下是几点提倡用const、enum、inline而不用define的理由: 1. 定义常量
2012-10-28 07:49:37 4054
原创 Lua函数的多个返回值
Lua中的函数的一个很特殊也很有用的性质,即可以有多个返回值。包括一些内置的函数就是这样。比如string.find函数,在给定的字符串中查找一个pattern,如果有匹配的部分,则返回对应的头、尾的两个索引值;如果不存在匹配,则返回nil。当然,用户定义的函数也可以有多个返回值,通过return关键字返回多个结果即可。比如一个返回数组中最大值及其索引的函数:function max(a) lo
2012-10-13 05:45:18 37032 2
原创 C++迭代器之'插入迭代器'
插入迭代器(Insert Iterator),又叫插入器(Inserter),是继上次的反向迭代器之后C++中的又一个迭代器适配器。插入迭代器的主要功能为把一个赋值操作转换为把相应的值插入容器的操作。插入迭代器对标准算法库而言尤其重要。算法库对所有在容器上的操作有个承诺:决不修改容器的大小(不插入、不删除)。有了插入迭代器,既使得算法库可以通过迭代器对容器插入新的元素,又不违反这一承诺,即保持了设
2012-10-11 23:00:10 8344
原创 C++迭代器之'反向迭代器'
反向迭代器(Reverse Iterator)是普通迭代器的适配器,通过重新定义自增和自减操作,以达到按反序遍历元素的目的。如果在标准算法库中用反向迭代器来代替普通的迭代器,那么运行结果与正常情况下相反。除此之外,其用法与普通迭代器完全一样,我们不作详细讨论。 这里主要讨论的是反向迭代器的一个很特殊、也很容易出错的性质,即它的“逻辑位置”与“物理位置”。先通过看一个例子开始:v
2012-10-11 20:00:00 6535
原创 C++中的函数对象(Function Object)(二)
除了自定义的函数对象,标准库还为我们提供了一系列现成的函数对象, 比如常见的数学、逻辑运算等。例如:negate(),plus(),minus(),multiplies(),divides(),modulus(),equal_to,greater(),less(),logical_not(),logical_and(),等等。 关于函数对象的最后一个很重要的概念是“函数适配器”。函
2012-10-10 04:27:59 7964
原创 C++中的函数对象(Function Object)(一)
一个函数对象,即一个重载了括号操作符“()”的对象。当用该对象调用此操作符时,其表现形式如同普通函数调用一般,因此取名叫函数对象。举个最简单的例子:class FuncObjType{public: void operator() () { cout<<"Hello C++!"<<endl; }};类FuncObjType中重载了“()”操作符,因此对于一个该类的对象FuncO
2012-10-09 08:24:32 39653 1
原创 C++中的异常安全性
一个函数如果说是“异常安全”的,必须同时满足以下两个条件:1.不泄漏任何资源;2.不允许破坏数据。 我们先通过两个反面的例子开始。 第一个是造成资源泄漏的例子。一个类Type,内含一个互斥锁成员 Mutex mutex,以及一个成员函数void Func()。假设Func函数的实现如下所示:void Type::Func(){ Lock(&mutex); DoSometh
2012-10-08 08:09:23 7695 3
原创 C++中的资源管理
C++中最重要, 也最令人头疼的事情之一就是资源管理。原则上,每次在堆区用关键字new申请一块内存,必须对应一个delete来释放它。对应一般的小程序,通过细心地写代码,很容易做到。但当程序变大、变复杂的时候,仅仅依靠谨慎的编写程序也是很难做到的。考虑以下几种情况:1. 用new申请资源与用delete释放资源之间的跨度比较大,很容易在做完中间一系列的任务后忘记最初曾申请过资源,导致未释放它。
2012-10-07 09:02:16 4218 2
D3D11法线映射示例
2013-03-11
D3D11 第一人称摄像机类的实现
2013-01-20
D3D11平面阴影实现
2013-01-16
D3D11(StencilBuffer)镜子的实现
2013-01-13
D3D11雾效示例程序
2013-01-10
D3D11纹理基础
2012-12-26
D3D11基本几何体绘制
2012-12-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人