2013年4月11日
摘要: 内存映射主要有两方面的作用,其一是对大文件的内存映射处理,其二是用于进程间共享。(1)内存映射文件处理过程首先,通过 CreateFile() 函数来创建或打开一个文件内核对象,这个对象标识了磁盘上将要用作内存映射文件的文件。 其次,通过 CreateFileMapping() 函数来为刚才创建的文件内核对象创建一个文件映射并告诉系统文件的尺寸以及访问文件的方式。 再次,通过 MapViewOfFile() 函数将文件内核映射对象添加到进程中。 接着,程序就可以通过指针进行常规的文件读取了,这里的操作就和文件操作一样。最后,用完之后还得回收,先用 UnmapViewOfFile() 将释放映射 阅读全文
posted @ 2013-04-11 11:46 apapaxionga 阅读(1066) 评论(0) 推荐(0) 编辑
  2012年4月1日
摘要: 浮点数保存的字节格式如下:地址 +0 +1 +2 +3内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM这里S 代表符号位,1是负,0是正E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。M 24位的尾数保存在23位中,只存储23位,最高位固定为1。此方法用最较少的位数实现了较高的有效位数,提高了精度。零是一个特定值,幂是0 尾数也是0。浮点数-12.5作为一个十六进制数0xC1480000保存在存储区中,这个值如下:地址 +0 +1 +2 +3内容0xC1 0x48 0x00 0x00浮点数和十六进制等效保存值之间的转换相当简单。下面的例子说明上 阅读全文
posted @ 2012-04-01 10:17 apapaxionga 阅读(324) 评论(0) 推荐(0) 编辑
  2012年3月28日
摘要: CUDA Texture Part.1 簡介在執行 CUDA 程式前,都要把資料先從 Host 的記憶體,複製一份到 device 的記憶體中;一般來說,這樣的部分,都是使用 device 的 global memory 來直接進行存取。不過實際上,有的時候還有別的選擇的~在《nVidia CUDA 簡介》中一文就有提到,除了 global memory 外,還可以透過 constant memory 或 texture memory 的形式,來對 device memory 資料的存取。texture 是一般 graphics 裡的名詞,2D texture 大致上可以理解為一張圖片,一般應 阅读全文
posted @ 2012-03-28 17:27 apapaxionga 阅读(326) 评论(0) 推荐(0) 编辑
摘要: 在 CUDA Texture 文章的第一篇大概講了一下 texture 在 CUDA 裡的基本概念,而第二篇則是講了 linear memory 的 texture,接下來,自然就是 CUDA Array 的 texture 了∼CUDA ArrayCUDA array 在 cuda 中是一個特殊的資料型別,叫做 cudaArray,在 CUDA 中,他應該是專門給 texture 用的一種型別;要對他做記憶體的管裡,則是要透過 cudaMallocArray()、cudaFreeArray()、cudaMemcpyToArray() 等函式。此外,由於 cudaArray 本身並非 temp 阅读全文
posted @ 2012-03-28 17:26 apapaxionga 阅读(911) 评论(0) 推荐(0) 编辑
摘要: CUDA Texture Part.2 Linear Memory在前一篇已經大概介紹過 texture 的基本概念了,在這一篇,就來大概看一下,一般使用 linear memory 的 texture 的方法吧。在宣告的部分,前面已經提過了,大致上就是:texture<int, 1, cudaReadModeElementType> texRef;的形式。這樣,就可以宣告出一個一維的整數 texture 了;而由於他的讀取模式是給定為 cudaReadModeElementType,所以之後由這個 texture 取出的值,也都會是整數(如果是 cudaReadModeNorma 阅读全文
posted @ 2012-03-28 17:24 apapaxionga 阅读(444) 评论(0) 推荐(0) 编辑
  2012年1月3日
摘要: 指针(Pointer) VS 引用(Reference)指针与引用看上去完全不同(指针用操作符“*”和“->”,引用使用操作符“. ”),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。“但是,请等一下”,你怀疑地 阅读全文
posted @ 2012-01-03 20:07 apapaxionga 阅读(511) 评论(0) 推荐(0) 编辑
  2011年12月29日
摘要: 在具体研究之前我觉得有必要把平面投影的分类简单介绍一下,目的是为了让大家有一个总体的认识,从而更好的理解这个知识体系。请看下图:平面投影分为平行投影和透视投影两种类型,后者我们在前两篇文章中介绍了。平行投影则是具有矩形观察体的投影方式(透视投影则是视锥观察体),它不会根据物体离视点的远近缩放物体(透视投影则会)。平行投影可以分成侧投影和正交投影两种类型。这两种类型如何区分呢?我们继续看图吧:上图中,v是投影平面,n是它的法线。p和q是平面外两点,p’和q’分别是它们在平面上的投影点。q的投影方向向量为Q = 单位化(q’-q),而p的投影方向向量为P = 单位化(p’-p),其中Q不平行于n而 阅读全文
posted @ 2011-12-29 16:58 apapaxionga 阅读(2404) 评论(0) 推荐(0) 编辑
摘要: 透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为。在算法中它是通过透视矩阵乘法和透视除法两步完成的。透视投影变换是令很多刚刚进入3D图形领域的开发人员感到迷惑乃至神秘的一个图形技术。其中的理解困难在于步骤繁琐,对一些基础知识过分依赖,一旦对它们中的任何地方感到陌生,立刻导致理解停止不前。没错,主流的3D APIs如OpenGL、D3D的确把具体的透视投影细节封装起来,比如gluPerspective(…)就可以根据输入生成一个透视投影矩阵。而且在大多数情况下不需要 阅读全文
posted @ 2011-12-29 16:46 apapaxionga 阅读(1056) 评论(0) 推荐(2) 编辑
  2011年7月31日
摘要: 本文主要介绍些在OGRE中创建Vertex Buffer和Index Buffer的主要流程。Vertex Buffer主要用来保存一组数据,这些数据可以包括顶点,顶点颜色,顶点法线或贴图坐标等等。Index Buffer是用来保存Vertex Buffer中对应顶点的索引。通过Vertex Buffer 和IndexBuffer 可以创建自己的Mesh并载入,以下是基本流程:首先:定义你自己的顶点数据(Mesh的坐标数据)和对应的顶点索引(注意三角形顶点顺序)例如:float vertices[vbufCount] = { -100.0,100.0,-100.0, //0 position. 阅读全文
posted @ 2011-07-31 00:26 apapaxionga 阅读(1940) 评论(2) 推荐(1) 编辑
  2011年7月27日
摘要: 新版Ogre的帧监听器(FrameListener)新加了一个方法,frameRenderingQueued,查看例子后发现,原先的frameStarted基本都被这个方法所代替了,决定打开源代码看看Ogre的意图。我们从renderOneFrame开始分析,这个方法只有三句话。1boolRoot::renderOneFrame(void)2{3if(!_fireFrameStarted())4returnfalse;56if(!_updateAllRenderTargets())7returnfalse;89return_fireFrameEnded();10}111.触发所有FrameLi 阅读全文
posted @ 2011-07-27 23:46 apapaxionga 阅读(1110) 评论(0) 推荐(1) 编辑