2011年12月12日
摘要: 最近在做基于GPU的并行BitonicSort排序,中间用到了矩阵转置。觉得矩阵转置虽然简单,但一个好的矩阵转置优化却很好表达了GPU程序优化的几个基本要素。所以记录下。这里GPU接口还是用Directx11的DirectCompute,然后为了便于着重算法重点,这里我们只讨论HLSL的代码。 最简单的GPU矩阵转置大家应该可以想到了,就是把X和Y做一个对换。//MatrixTransposeCodeStructuredBufferinData;RWStructuredBufferoutData;[numthreads(TRANSPOSE_BLOCK_SIZE,TRANSPOSE_BLOCK. 阅读全文
posted @ 2011-12-12 10:57 Bester 阅读(524) 评论(0) 推荐(0) 编辑
  2011年11月28日
摘要: 拾取是图形学里一个很常用的应用,在3D世界里选中我们想要的东西,枪战游戏中判断子弹是否射中敌人。 这里我们讲下如何实现一个精确的拾取碰撞,不仅检测是否射中了这个物体,更进一步的返回射中了这个物体的上哪个三角形。在《COD》等比较优秀的枪战游戏中,我们都可以看到子弹是射中敌人身体的不同部位,敌人的身体会做出不同的反应。 然后我们看看如何实现一个基于GPU的拾取,把拾取的所有计算都映射到GPU上去。这里我们分别用GeometryShader和ComputeShader来做一个实现。这一篇先用GeometryShader来实现。程序主要是如果点击鼠标,选中了哪个三角形,就绘制它,其它三角形就以线框. 阅读全文
posted @ 2011-11-28 21:49 Bester 阅读(409) 评论(0) 推荐(0) 编辑
  2011年11月23日
摘要: 粒子系统作为在游戏中一个挺常见的技术,用在各种爆炸,下雨,火焰等特效中。我们利用GPU中的GeomtryShader来实现一个粒子系统。以下雨特效为例。 介绍粒子系统具体实现前先介绍下GeomtryShader的StreamOutput这个特性。StreamOutput这个Stage把GeometryShader的计算结果输出到一个buffer中。 下面主要从Shader代码设计的角度讲下如何实现一个下雨特效的粒子系统,其核心算法说白了就一句话:分成主粒子和副粒子。主粒子按时间间隔分裂副粒子,副粒子到了一定的时间就死亡。 绘制时要么用公告板绘制一个粒子,要么用一条直线绘制一个粒子。 只是具.. 阅读全文
posted @ 2011-11-23 11:10 Bester 阅读(555) 评论(0) 推荐(0) 编辑
  2011年11月22日
摘要: 随机数在CPU中可以有rand()这类函数,但是GPU中却没有。如果想直接在GPU中使用随机数?有一个折中的方法,先再CPU中产生一个随机数数组,然后写入一个texture1D中。最后再利用GPU来提取。 下面来看看具体代码: 先看Directx的部分。1:主要在Directx中生成并初始化一个存储了随机数的纹理ID3D11Texture1Dm_pRanTex和它的“指针”ID3D11ShaderResourceViewm_pRanTexRV。HRESULTParticleSystem::BuildRandomTex(){HRESULThr=S_OK;D3DXVECTOR4randomVal. 阅读全文
posted @ 2011-11-22 20:55 Bester 阅读(968) 评论(0) 推荐(0) 编辑
摘要: 公告板是游戏里一很常见的技术,用来绘制树木,草地,爆炸效果等。说白了就求一个矩形框,然后贴一张照片上去。(Ps下由于个人博客所以讲的比较随便,有时候讲billboard,有时候公告板,有时候一个矩形框,都指差不多一个东西) 而GeometryShader则是Directx10里面推出的一个新的Shader能够处理完整的几何模型。想典型VertexShader只知道并处理顶点,而GeometryShader知道顶点,直线和三角形并处理它们。 这里用个Demo阐述下如何用GeomtryShader在GPU中绘制Billboard公告板。 1先讲下求公告板的算法。说白了就是求它的世界坐标系。 假设. 阅读全文
posted @ 2011-11-22 14:42 Bester 阅读(300) 评论(0) 推荐(0) 编辑
  2011年10月31日
摘要: 有点意思的小题目一般设置两个指针p1,p2首先p1和p2都指向head然后p2向前走n步,这样p1和p2之间就间隔n个节点然后p1和p2同时向前步进,当p2到达最后一个节点时,p1就是倒数第n个节点了http://topic.csdn.net/u/20100408/19/f8c04daa-67b9-407c-afa7-f1c731bf9aa5.html 阅读全文
posted @ 2011-10-31 16:02 Bester 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 启用内存泄漏检测Visual Studio 2008 更新:2007 年 11 月本主题适用于: 版本Visual Basic C# C++ Web Developer 速成版仅限本机标准版仅限本机专业团队版仅限本机表格图例:适用不适用默认情况下隐藏的一条或多条命令。检测内存泄漏的主要工具是调试器和 C 运行时库 (CRT) 调试堆函数。若要启用调试堆函数,请在程序中包括以下语句:other#define _CRTDBG_MAP_ALLOC#include #include 说明:#include 语句必须采用上文所示顺序。如果更改了顺序,所使用的函数可能无法正确工作。通过包括 crtdbg. 阅读全文
posted @ 2011-10-31 10:34 Bester 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 原作出处http://blog.csdn.net/xushiweizh/article/details/1451083最快速度找到内存泄漏内存管理是C++程序员的痛。我的《内存管理变革》系列就是试图讨论更为有效的内存管理方式,以杜绝(或减少)内存泄漏,减轻C++程序员的负担。由于工作忙的缘故,这个系列目前未完,暂停。这篇短文我想换个方式,讨论一下如何以最快的速度找到内存泄漏。确认是否存在内存泄漏我们知道,MFC程序如果检测到存在内存泄漏,退出程序的时候会在调试窗口提醒内存泄漏。例如:classCMyApp:publicCWinApp{public:BOOLInitApplication(){i 阅读全文
posted @ 2011-10-31 10:14 Bester 阅读(107) 评论(0) 推荐(0) 编辑
  2011年9月10日
摘要: 很多学Directx特别初学者最头痛应该是shader的调试问题了。一般的编译器包括vs都不支持shader的调试。还好微软出了个Pix,其功能相当强大,而不仅仅是debug。这里我们入门主要总结下其debug的功能。 Pix的调试原理和一般的调试很不一样,它是先把程序运行一遍,然后把中间每一步所有的shader变量,寄存器等等都记录下来,然后再调出来看,以此模拟Directx的过程。 在用Pix调试shader代码前,要注意下几个问题。 1是必须在Directx11的编译hlsl函数加上下面的几行代码(注意加粗部分代码):DWORDdwShaderFlags=D3DCOMPILE_ENAB. 阅读全文
posted @ 2011-09-10 17:34 Bester 阅读(391) 评论(0) 推荐(0) 编辑
摘要: 内存覆盖是个很简单又很隐蔽的错误。如果在程序中发现某个数组a的一些结果被莫名奇妙改写了,但你可以很肯定你没有在代码中修改它们。很有可能内存被不小心覆盖了。例如: int b[100]; int a[100]; int c=102; b[c]=5; 与数组a相邻的数组b不够大,开了b[100],程序中不小心给越界的b[102]赋值,那么就有可能造成数组a中间一些数值被覆盖(当然也可能有其他问题,如程序崩溃)。 malloc()函数也可能导致类似的错误。如果函数的实参为sizeof(int),用于生成一个整型数据需要的大小。如果你写成: int*p=(int*)malloc(1); 代码也能... 阅读全文
posted @ 2011-09-10 16:14 Bester 阅读(417) 评论(0) 推荐(0) 编辑