谨以此文缅怀我18个小时的持续工作,今天金工实习西门子CNC的时候乘着空闲还在草稿纸上不断的写写画画。我觉得这项技术还是有意义的,可能我还是比较愚蠢,基础不够,还没有办法解决这个问题。

  我们在使用GPU做光线跟踪的时候,无一例外的要找到一个加速遍历场景的方法。在体素渲染Volumn Rendering中,大部分还是使用的固定网格Uniform Grid Structure进行渲染,效率比较低。我们只有在来自Standford的一些GPU光线跟踪器的实现的Paper中才可以看到kD树的身影。如何使用kD树分割模型大家可以看我以前写的那片利用SAH分割模型的文章,在许多著名CG人士提供的自己的代码中都有各自kD树的实现。问题是,GPU上如何实现呢?

  GPU的优点极多,主要是,超快的SIMD/MIMD指令处理单元,特别优化过的纹理寻址功能,在这两点上CPU就远远比不上了。但是最为致命的一点,目前的GPU无法在Shader中访问内存,也就是还没有实现指针结构,无法实现动态内存分配,当然分配的应该是显存。如果用CUDA,可能可以实现,不过那是后话,还没有多少人拥有G80系列的显卡,那样也没有实际的意义了。

  我的构想是,在Shader中增加3个纹理贴图。一个是平面纹理化的kD树,另外两个是绑定盒,分别储存对点的两个坐标,为了能够遍历三角形,我们还需要把三角形按照次序把3个顶点分别储存到3个纹理中。由于这个kD树还需要与三角形索引纹理进行交互,所以,我们必须事先准备好“混乱索引数组”Chao Index Array,下面简称CIA(可不是中央情报局)。下面详细解释这些个纹理在Shader里是如何运作的,示意图如下。

  我们都了解了kD树的构造。首先,kD树的节点分为2类,一类是Node类型,一类是Leaf类型。Node类型记录了当前分割的维度和分割位置,不储存任何几何体信息。而到了树的底端,就差不多都是Leaf类型了。Leaf类型记录了三角形的树木和在CIA中的起始偏移位置。为什么是CIA而不是标准的从0开始的索引呢?因为我用的kD树构造方法,使用了STL中的stable_partition算法处理三角形数组。

  在Shader里面,首先我们计算光线的起始位置和方向,这个很简单。然后,我们把绑定盒的世界位置输入(或者我们仅仅绘制绑定盒),在FragShader中开始遍历kD树纹理。首先从最底层开始,取得第一个整数,如果是在123范围内就认为是Node(其实肯定是的),如果是Node,查询后面的SplitPos,通过这个整数,在SplitPosArray中找到具体的分割位置,判断向左向右。如果需要向左,查询Left中的整数,自动的给这个纹理坐标的t分量加上偏移量,开始新的查询,直到找到Leaf,读取偏移量和三角形数目,开始测试插值。

  所有的纹理都使用RECTANGLE_NV纹理,使用Nearest过滤方式。

  伪GLSL代码如下:

ivec2 traverselptr(0,0);

bool found = false;

int offset = 0,count = 0;

while( found == false ){

int Dim = texture2D(kDAccMap,traverselptr.st).x;

if( Dim == 4 ){

found = true;

offset = texture2D(kDAccMap,traversalptr+ivec2(0,4)).x;

count = texture2D(kDAccMap,traversalptr+ivec2(0,5)).x;

countinue:

}

TestRay();

if ( need goto Left ){

traverselptr.s += texture2D(kDAccMap,traverselptr + ivec2(0,1));

}else if( need goto Right ){

traverselptr.s += texture2D(kDAccMap,traverselptr + ivec2(0,2));

}

}

for( int i=0;i<count;i++ ){

//use CIA and standard triangles index to coordinate vertices

}

  看起来挺不错是么?这里有一个严重问题:如果我们需要同时遍历Left和Right如何是好?在CPU上,和OpenRT的设计上,这里是使用了一个优先堆栈,可是在Shader里面有这个玩意么?也许这个情况的出现导致出错的概率比较小,可是依旧需要考虑到。

一个失败的创意:GPGPU纹理化通用加速kD树的实现相关推荐

  1. gpu处理信号_GPU显卡不仅用来打游戏那么简单,它还可以用于通用加速计算

    如今,显卡不仅在工作站.个人PC中变得非常重要,而且在数据中心也处于举足轻重的地位.CPU负责通用计算.GPU负责加速计算已经成为绝大数数据中心一种常态.用于加速计算的GPU专用处理器,它将计算密集型 ...

  2. 一个好的创意值多少钱?

    一个好的创意值多少钱?DerekSivers认为,不值多少: 译者注:Derek Sivers是一位创业家,原本拥有音乐人和小丑身份的他,在1998年因为创设CD Baby而一举成名.CD Baby当 ...

  3. 一个失败项目的复盘会

    2018年5月份笔者参加了一个失败项目的复盘会,领导开场介绍了这个项目的基本情况,2017年中标某集团十多个省的云平台安检项目,公司之前做了好几年上百个类似的安检项目,经验较为丰富,所以在多家厂商竞标 ...

  4. 开发板visionpro视觉通用检测框架源码,c#+vp, vp9.0,一个测量的程序可作为通用的检测框架使用

    开发板visionpro视觉通用检测框架源码,c#+vp, vp9.0,一个测量的程序可作为通用的检测框架使用.功能模块完整,像什么视觉处理,数据处理,文件操作,IO卡应用等都有,学习与项目参考比较好 ...

  5. 创意毕业答辩通用PPT模板

    模板介绍 精美PPT模板设计,创意毕业答辩通用PPT模板.一套论文答辩幻灯片模板,内含橙色,蓝色多种配色,精美风格设计,动态播放效果,精美实用. 一份设计精美的PPT模板,可以让你在汇报演讲时脱颖而出 ...

  6. PS教程之利用像素化来制作一个乐高积木的创意海报

    我们利用像素化来制作一个乐高积木的创意海报,我们选了一张蒙娜丽莎的照片.用这个照片来完成我们的像素化讲解. 1. 打开PS,把素材拖进PS中,选择滤镜-像素化-马赛克.在弹出的对话框中设置数值为100 ...

  7. sba(sparse bundle adjustment):一个基于Levenberg-Marquardt(LM)算法的通用稀疏光束法平差C/C++软件包

    [转]sba(sparse bundle adjustment):一个基于Levenberg-Marquardt(LM)算法的通用稀疏光束法平差C/C++软件包 2011-01-04 10:44 转载 ...

  8. 我有一个手机APP 创意,如何将其实现? 借助平台可以自己做

    我有一个手机APP创意,如何将其实现? "我有一个创意,关于手机APP 的,到哪里去找风投?谢谢" "我有一个创意APP,有要懂程序合作的没" "我业 ...

  9. 俞敏洪语录:每一个失败的男人后面甚至不只一个女人

    1 .每一个失败的男人后面也有一个女人,甚至不止一个女人. 2 .在老妈面前,在父母亲面前下跪,这是不丢脸,但是千万别在老婆面前下跪. 3 .北大教书还有一个传统就是老师上课是不能点名的,这个传统不是 ...

最新文章

  1. sprintf-%s的用法
  2. 开发常见错误解决(7)连接到SQL Server 2005出错
  3. React中的状态管理---Mobx
  4. YbtOJ#732-斐波那契【特征方程,LCT】
  5. 【转】什么是SIEM?
  6. 企业电力征信大数据价值挖掘与应用
  7. linux 使用 byzanz 生成 gif 图片程序
  8. Objective-C中的NSNumber和NSString
  9. kali没有arpspoof命令_windows环境下使用python3命令
  10. jprofiler_监控远程linux服务器的JVM进程(转 非常棒)
  11. 软件工程 第四章 概要设计
  12. 二维波动方程matlab,二维波动方程matlab
  13. python 微信开发库_WeRoBot 是一个微信公众号开发框架
  14. 修改macOS中鼠标滚轮方向
  15. 概率论(三)-多维随机变量及其分布:n维随机变量、概率分布函数F(x1,x2,..xn)、联合分布律、联合概率密度、边缘分布律、边缘概率密度、条件分布律、条件概率密度、β函数、Γ函数、max{X,Y}
  16. recovery 工作流程
  17. 5G时代的到来--5G技术介绍
  18. 综合日语第一册第九课
  19. C语言停车场管理模拟系统
  20. 十人即开团,分销商城全民拼购模式解析

热门文章

  1. c 语言中的菱形继承,C++中的菱形继承深入分析
  2. 二十五、MongoDB 索引 和 explain 的使用
  3. Hadoop伪分布安装详解(四)
  4. nth-child和蝉原则实现的奇妙随机效果(译)
  5. Java学习笔记(基本数据类型和变量命名规则)
  6. Object-C,四则运算计算器
  7. 在FIREBUG控制台中输入 jQuery() 返回 []
  8. sql sum()对空值的处理
  9. ProtoBuf3语法指南(Protocol Buffers)_下
  10. js实现sleep休眠