- 博客(39)
- 收藏
- 关注
原创 该充电时就充电,电池生命力才会持久,人何尝不是呢?
新的工作环境,有干不完的事情,很久没给自己预留固定的时间进行学习新知识了,这样时间长了,浑身觉的不自在。还是指定一个切实可行的计划吧:需要学习的内容先罗列下:1. unity 引擎; 结合项目需要研究不同的模块。2. javaScript ;3. c# ;4. java ;5. dx10; SDK6. 增强现实: 复习OGL; 剖析例程每天至少拿出两个小时来学习和思考问
2011-07-02 11:52:30
546
原创 雾
<br />简单的介绍一下D3D9的雾<br /> <br />D3D9 提供了两种往场景中添加雾的方法,顶点雾和像素雾。简单的说 ,像素雾 又叫做 table fog 是在显卡驱动中计算的雾。而顶点雾是在D3D 光照引擎中计算雾。应用程序可以同时使用 顶点雾和像素雾来实现雾效。<br /> 不管用什么方法来实现雾效,都必须提供一个正确的投影矩阵,否则雾效都不正确。如果雾效不正确,请仔细检查投影矩阵。<br /> <br />雾的计算公式有三种:<br /> <br />Linear Fog<
2011-04-06 22:27:00
692
原创 dx10 学习随笔(五)
Shader StagesD3D10 管线包含3个可编程 shader Stages:1、Vertex-Shader Stage:2、Geometry-Shader Stage:3、Pixel-Shader Stage:下面对这三个 Stage 进行详细的介绍:一、Vetex-Shader Stage:VS Stage 对从 IA Stage 传输过来的数据进行 transformation 、skinning、morphing、per-vertex lighting 等操作。VS 的输入是一个顶点,输出也
2011-02-28 23:57:00
770
原创 dx10 学习随笔(四)
Input-Assemble (IA) Stage本文开始,从Input-Assemble Stage开始对Pipeline Stage进行全面详细的阐述。前面讲过,D3D10 API 把管线安装功能划分为若干个Stage,其中第一个Stage就是Input-Assemble (IA) Stage。IA Stage 的第一个目的是从用户定义填充好的buffer中读取数据,并把数据组装成管线中其他Stage可以使用的图元。IA Stage可以把顶点组装为不同的图元(line lists、triangle st
2011-02-28 22:34:00
898
原创 dx10 学习随笔(二)
Direct3D 10 的管线状态1、Input-Assembler Stage : 负责给管线提供数据(三角形,线和点)。2、Vertex-Shader Stage: 顶点处理。执行诸如,位置变换、蒙皮、光照等计算。接受一个顶点作为输入,并产生一个相应的顶点作为输出。3、Geometry-Shader Stage: 图元处理。输入是一个完整的图元(三角形图元就是三个顶点、线图元就是两个顶点、点图元就是一个点)。除此之外,每个图元还可以包 含相应的临界图元的信息。GS 还支持有限的图形的放大和缩小
2011-01-28 23:38:00
671
原创 年度总结之九: 玩家的问题
大规模测试即将到来,在这之前,相信所有的图形程序头痛的都是机器配置的测试,我们公司的这些测试都是我来做的,当时给了我两台机器和若干各个级别的显卡。测试下来虽然耗时,但也算顺利,基本达到原定计划。激动人心的时刻终于到了,在测试过程中,最让我神经过敏的无非就是玩家因为配置问题玩不了游戏的情况。现在根据我遇到的情况,总结一个排除问题的步骤:1、根据玩家描述直接能确定的问题。2、先指导玩家到 NV 或 AMD 等显卡厂商官网下载对应的驱动,本人建议有必要在游戏官网给出链接,在玩家提出问题后再回复中根据其显卡型号再提
2011-01-21 21:35:00
428
原创 年终总结之七:烦人的字体
<br />简单的介绍一下字体渲染流程:<br /> <br />1.创建一个管理类,包含一个单链表存储字符信息;2.GDI部分,负责创建字体,并把字体信息拷贝到指定大小的buff;3.读取上述buff中的字体信息,并加以高斯模糊;4.把上一步的结果,渲染到已预先创建的512*512大小的纹理上,并保存纹理坐标到字符信息中;5.实际绘制时根据字符编码读取字符信息,绑定指定的纹理,填充顶点、纹理坐标、颜色,在指定位置渲染。注:字体网格是用TriList组织的,便于合并不同的三角形,减少
2011-01-20 23:35:00
568
原创 年底总结之六:洗心革面终点站,深度优化之君子善假于物
<br />游戏画面很棒,可玩性也不错,但是这时却发现大部分机器跑起来都不到30帧。相信很多公司都遇到过这种尴尬的情景。偶的上家公司很大程度上就是死在性能上。那么既然优化这么重要,为什么不一开始就重视起来呢。哈哈,不是不重视,原因有很多种,下面列举一些:<br /> <br />1、由于进度鸭梨太大,程序们来睡觉的时间都没有,优化见鬼去吧,先把功能实现吧。<br />2、美术与程序的较力,美术经常在不知不觉中添加N个能突出场景画面的粒子特效等程序无法忍受的东东。<br />3、引擎本身的承载鸭梨不够。<br
2011-01-20 23:34:00
746
原创 年度总结之五:洗心革面第二站,PostPocess
<br />这部分比较简单,就是采样,模糊,混合的过程,用到了4个RT,3个shader。<br /> 具体细节不再赘述,关键是最后要提供给美术或策划特定的参数。使得效果更加贴切,更加丰富。
2011-01-20 23:32:00
575
原创 年度总结之四:洗心革面第一站,全可编程管线
<br />缘由:在后续使用的MRT技术中,会输出顶点的深度信息到一个RT上,这个深度信息在PostPocess时会用到,而MRT只能在PS里来实现。这就必须把所有渲染改为可编程管线。<br /> <br /> 注意事项:<br />就是用VS来替代顶点变换,用PS来替代纹理着色及纹理混合(这里的纹理混合指同一个pass的纹理之间的混合)。其实,关键在于搞清楚每个要修改的渲染需要几层纹理,及每层之间是如何混合的,最多再加上光照的处理,弄清楚了整个过程,把固定管线改成shader渲染就很easy
2011-01-20 23:30:00
792
原创 年度总结之三:底层驱动的改写
<br />来公司的第一项工作就是把引擎的图形驱动层由OpenGL改成Direct3D。<br /> <br />整改缘由:<br /> 1. 虽然市面上的大部分显卡都支持OpenGL,但是还是有一部分不支持。<br /> 2. 某些显卡虽然支持OpenGL但是其驱动不支持,目前所知,windows默认的驱动都是不支持OpenGL的。需要玩家下载驱动。<br /> 3. N显卡对OpenGL的某些特性是默认关闭的,需要使用NVemulate工具才能打开;<br />
2011-01-20 23:22:00
1298
转载 年度总结之二:GPU Driver
<br /> <br />关于Direct3D驱动流程的大致描述<br /> <br /><br /> <br /> <br /> <br />上图的流程可以知道, 任何一个有界面的程序, 如果要显示在具备独立显卡的显示器上, 首先第一步要做的就是在显存中分配空间, 此内核函数DxgkDdiCreateDevice(DirectX graphic kernel driver device interfacecreate deivce的缩写)是由显卡厂商提供的,
2011-01-20 18:29:00
4787
原创 年度总结之一:半透物体处理
<br />好久没写了,这段时间相对较闲,把前段时间遇到的问题和解决方法及后续的问题进行梳理和总结,也算是2010年度总结吧。<br /> 这次先从半透明物体的渲染说起 ,为了方便期间,分以下几种常遇到的情况来讨论:<br /> <br /><1> 半透物体极少,只有一两个,其相互之间也不会出现重叠。<br /> <br />这也是最简单的一种情况。先渲染不透明的物体,然后开启alphablend,禁止深度写和alphatest,再渲染半透物体,即可。看起来问题就解决了。但是在实现的时候会发现
2011-01-20 15:14:00
1379
原创 C++ 代码优化
<br />本文仅仅记录一部分常用的C++代码优化技巧:<br />1.首先,要对release version进行性能测试和优化。对debug version进行测试没有任何意义。<br />2.对局部变量在使用之前再对其进行声明和初始化,这样既可以防止该变量的值被其他代码改变,并且通过初始化而不是赋值可以提高效率。<br />3.使用初始化列表来初始化自定义对象。<br />4.在可能的情况下,用prefix代替postfix。<br />5.尽量使用内敛函数,但不要滥用,如果,函数超过10行或包含循环
2010-08-07 17:23:00
606
转载 D3D9的ID3DXInclude使用心得
<br />最近使用材质节点生成HLSL代码并开始编译,也顺手开始搭建一个正规的Shader包含及编译流程,所以用到了D3DXCompileShader及ID3DXInclude <br />ID3DXInclude的使用方法在OGRE 1.65(或者类似的版本)的OgreD3D9HLSLProgram.cpp中有源代码可供参考 STDMETHOD(Open)(D3DXINCLUDE_TYPE IncludeType, LPCSTR pFileName,
2010-07-14 11:12:00
926
原创 z-fighting的经典处理
使用Z-Bias解决Z-Fighting问题的替代方案 只提供网址:http://www.opengpu.org/viewthread.php?tid=491&highlight=z-fighting 该文章中提到的前两种方法,无论是改变投影矩阵,还是改变视口矩阵,其本质是一样的,无非是在绘制想看到的面之前,改变写入z-buffer中的值,具体说就是把想看到的面的z值变小。至于第三种方
2010-05-15 17:23:00
2373
原创 关于dp
在把OpenGL改造成D3D之后发现帧率降低了不少,经过一番的调试跟踪,发现了OPenGL与D3D的渲染机制存在这很大差别,对原来的引擎是基于OPenGL来写的,在很多地方比如地形和特效渲染时,dp量特别大,如,地形是每10个三角形就dp一次,有的专职特效是将近300多次的dp量,导致在D3D渲染时效率极低,或直接卡死。这就说明了在D3D渲染时,对DP有严格的限制,而OpenGL则没有相关限制,深
2010-05-15 12:26:00
811
原创 着色模式
在把OPenGL改成D3D之后,使用菱格编辑器时发现,整个菱格在X轴方向偏移了一个单位,百思不得其解,后来发现跟着色模式有关。菱格绘制是线框模式,着色模式采用固定着色,以trangleList绘制,在OpenGL中,如果以trangleList绘制,则整个三角形的颜色取最后一个顶点的颜色,而在D3D中,则取第一个顶点的颜色,而在整改过程中,使用的还是旧的索引顺序,而菱格的颜色是由其右上角的顶点
2010-05-15 12:09:00
636
转载 为DrawPrimitiveUP(DrawUserPrimitive)洗冤
最初只因DXSDK文档里说了句推荐用Vertex Buffer而不要用DrawPrimitiveUP(C#里叫DrawUserPrimitive),DrawPrimitiveUP很快被描绘成传说中的瘟疫,人人都在警告不要接近它。估计有人会想过,既然DrawPrimitiveUP这么不好,为什么还要提供它,难道只是为了显示DX也可以像OpenGL一样简单地画三角形?记得当年我就是抱着这种想
2010-02-22 22:59:00
664
原创 dx版本升级
最近在把公司的引擎从dx7升级至dx9,版本升级中遇到的问题总结如下: 当由dx7或dx8升级至dx9时,需要在绘制函数调用之前加上顶点声明,如果是固定管线,加上IDirect3DDevice9::SetFVF 如果是顶点shader,加上IDirect3DDevice9::SetVertexDeclaration。
2010-02-22 22:30:00
923
原创 pix使用技巧
使用pix调试torque3D,捕捉某一帧的数据,在Events面板中展开该帧的所有函数,会发现整个绘制过程一览无余。基本过程如下: 注意:要在某个表面上绘制图像,就要把该图像设置为renderTarget。 beginScense 开始绘制 1.ShadowMapPass_Render; 2.RenderPrePassMgr_Render; 3.AdvancedLig
2010-02-18 18:25:00
2400
原创 Torque智能指针及临时内存
在游戏的每一帧中都可能会分别和释放一些内存,如果不特殊处理则这种频繁的内存分配和释放会影响游戏性能。在Troque中采用了临时内存的方式解决了这个问题。基本原理就是,在游戏初始化时分配#define TORQUE_FRAME_SIZE 16 1.FrameAllocator。 该类是最基础的类,使用时要先获取分配前的watermark,然后进行内存操作(即调整watermark
2010-02-17 23:35:00
1308
1
原创 fxc的使用及shader调试技巧
如果当前使用的版本是dx10的fxc,则当前fxc不支持ps_1_x的shader,在编译该类shader时需加上/Gec,fxc会自动的把ps_1_x版本的shader编译成ps_2_x的版本。当然该shader只能在支持shader2的机器上运行。如果要使用传统版本的fxc即dx9下的fxc,这时要使用/LD,此时就支持ps_1_x到ps_3_x的所有的shader版本。查看所有的编译
2010-02-16 09:01:00
10494
原创 shader基础
顶点着色器基础 顶点着色器取代了图形管线中的顶点处理过程。当使用了定点着色器,有关变换和光照操作的状态信息就不再由固定的图形管线来处理了。当顶点着色被禁止,固定管线可以再次回来处理这些状态信息。 镶嵌技术,镶嵌高级图元的过程会发生在顶点着色之前。只有在dx11中该技术才能得到完全的硬件加速。 顶点着色器至少会输出具有相同性质的顶点顶点位置信息。作为可选项,顶点着
2010-02-15 18:04:00
2957
原创 纹理过滤
纹理过滤 Microsoft® Direct3D®在渲染图元时,要把三维图元映射到二维屏幕上。如果图元贴有纹理,那么Direct3D必须用该纹理给图元在二维屏幕上对应的每个像素产生一个颜色。对于每个像素,Direct3D必须从纹理获得一个颜色值,这个过程被称为纹理过滤。在执行纹理过滤操作时,正在使用的纹理一般会被放大或缩小,换句话说,就是纹理被贴到比它大或比它小的图元上。纹
2010-02-12 15:57:00
4703
原创 压缩纹理(续)
前面详细介绍了压缩纹理dds的各种格式DXT1~DXT5,下面来详细介绍一下怎么具体使用压缩纹理。 【一】怎么创建dds文件:1、photoshop插件导出的方式,通过把dds.8bi拷贝到插件格式目录中即可。2、directx 的Texture tool也可以实现dds文件的创建和修改转换等功能。注意:一般需要将纹理大小修改成2的指数倍才能执行转换。 【二】怎么读取d
2010-02-12 11:25:00
876
原创 压缩纹理相关
压缩纹理相关 纹理在光栅化阶段被映射到模型上,在这个过程中会消耗掉大量的系统总线和内存。为了减少纹理占用的内存的数量,d3d支持纹理压缩技术。一些设备与生俱来拥有纹理压缩支持。在这些设备上,可以创建压缩表面并加载数据到该表面上,该表面和其他的非压缩的表面一样使用。d3d在把纹理映射到模型上时进行解压缩。 存储效率和纹理压缩 所有的纹理压缩格式大小必须是2的指
2010-02-12 00:20:00
821
原创 自动纹理管理
d3d中的自动纹理管理 纹理管理是在给定的时间确定哪些纹理需要渲染并保证那些纹理被加载到显存的过程。纹理管理算法可能非常复杂,但是它基本上都会包含下面三个主要步骤:1. 跟踪可以获取到的显存的总量;2.计算哪些纹理是渲染所必须的,哪些不是;3.确定哪些显存中的纹理资源需要被另外的纹理图片替换; d3d实现了系统支持的纹理管理,保证了纹理加载的性能很快。d3
2010-02-11 19:58:00
797
原创 快捷键 可以提高很多开发效率的呦
Shift+Alt+Enter: 切换全屏编辑 Ctrl+B,T / Ctrl+K,K: 切换书签开关 Ctrl+B,N / Ctrl+K,N: 移动到下一书签 Ctrl+B,P: 移动到上一书签 Ctrl+B,C: 清除全部标签 Ctrl+I: 渐进式搜索 Ctrl+Shift+I: 反向渐进式搜索 Ctrl+F: 查找 Ctrl+S
2010-02-11 09:33:00
465
原创 d3d资源管理
资源锁定意味着能通过CPU来访问该资源。锁定选项有以下几种:D3DLOCK_DISCARD, D3DLOCK_READONLY, and D3DLOCK_NOOVERWRITE 等,但是只有这三种是经常使用的。运行时并不会检查应用程序是否遵循了制定的锁定标记所规定的访问方式。也就是说,当指定了D3DLOCK_READONLY后,再去写资源操作,会得到意外的结果,但不会提示是由于写操作导致出
2010-02-07 11:07:00
1484
原创 d3d设备基础
1.d3d 设备创建时,类型主要有两种,HAL(硬件抽象层)和REF(引用设备),前者基于硬件支持,速度会很快,但是不一定支持所有的d3d特征,后者,虽然没有硬件加速,速度很慢,但是能支持所有的d3d特征,一般情况下使用HAL,在出问题时,可以改成REF,如果问题不存在了,说明是硬件功能问题或显卡驱动问题,如果问题还存在,则说明是应用程序的问题:( 。2.使用HAL设备时,可以使用硬件顶点处理
2010-02-05 23:47:00
1766
原创 空间划分及可见性算法【三】
前面讨论的BSP和Portal大多数情况会被用于室内场景的管理,更确切的说是在充满分割面的场景中。在室外场景管理中一般会用到BHV(包围体层次结构)或八叉树(num_division = 2的一种特殊的BHV)。 关于如何创建BHV及如何遍历BHV树利用视椎体进行剔除就不在赘述了。但需要认识到以下几点:BHV树也是需要离线创建的。层数的限制很自由,至少有以下选择: (
2010-01-24 09:22:00
1765
原创 空间划分及可见性算法【二】
先来复习一下背面消隐: 前提为左手坐标系,每个三角形都会以一定顺序存储三个顶点,按照这个顺序观察三角形,如果是顺时针方向则该面为三角形的正面,另一个面为三角形的背面。有了该假设,我们就可以计算三角形的面法线了,该法线垂直三角形面并指向三角形的正面。选择三角形面上的一点为起点,视点为终点构造一个向量,起名叫做视点向量。根据法线向量和视向量的点积的符号很容易计算该面是否是正面朝向的,即是
2010-01-23 22:31:00
1790
原创 空间划分及可见性算法【一】
最简单的流水线可见性处理如下:对每个物体转换到世界坐标,然后进行视椎体剔除,其次是背面消隐,最总通过空间剪裁和光栅化期间的图像空间裁剪得到最终的要绘制的图像。在场景很简单,物体很少的情况,上述方法是可行的。但考虑到现代游戏的场景复杂程度,如果还采用上面的流水线来提出多边形,就显得力不从心了,因为这意味着在每次移动摄像机的时候都要对场景中的所有的物体进行视椎体的剔除及背面消隐,而这根本是不肯
2010-01-22 21:27:00
3567
1
原创 马的遍历问题
最近在复习一些数据结构和经典算法在写马的遍历问题时遇到了死循环,不知道问题出在哪里,下面是代码,请高手指点//马的遍历bool travelCells(int x,int y,vector>& cellsVV,vector>& passVV){ static int hasPassed = 0; cellsVV[x][y] = 1; hasPassed++; if(64 == ha
2010-01-15 09:34:00
800
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人