基于GPU的光线投射体绘制

这篇文字将会讲述怎么运用OpenGL和nVidia Cg进行基于GPU的光线投射体绘制。 读者最好具有OpenGL和顶点-片段渲染的相关经验。

首先,我们为什么需要这个算法?因为我们需要高质量的体绘制效果,而且光线投射非常实用于现在的GPU。由于统一渲染系统尤其是适用新的8800系列。

因为在渲染如上图那样的体数据的时候,遇到了一些技术上的困难,所以这篇文字主要是为了帮助人们初步认识GPU光线投射算法。

算法的核心是很对每一个屏幕像素发出一束光线,并且在体数据中跟踪这条光线。这在片段程序中是可行的,而且渲染可以实时完成。这种技术对于一些实例效果是很灵活的,比如阴影可以通过几行代码即可实现。

这是光线投射算法的概念图片,每个像素都产生一条光线,并且在体数据中进行跟踪。

为了产生我们需要的光线,我们使用了一个巧妙的方法,那就是通过OpenGL渲染几何体。你可能会问:这能够给我们带来什么样的帮助啊?

首先,我们定义一条光线:

(1)一条光线可以用一个初始点o和一个方向向量dir即可表示。

(2)一条光线表示了三维空间中得一条直线,可以用公式P(t)=o+dir*t。

(3)所以为了产生光线我们需要找到初始点和方向向量。

这可以通过这样的方法来完成:渲染一个立方体,其颜色即代表该点的坐标。然后让OpenGL的插值功能去完成剩下的事情。如下图所示,方法就是渲染一个单位立方体的前面和后面。

如果我们用后面(右图)的点减去前面的点,那么就可得到每个像素对应的方向向量。这个就是我们的光线的方向。初始点 就是立方体的前面的值。所以我们必须做两次渲染工作:一次渲染前面,一次渲染后面。在渲染背面的时候,我们启用前向面剔除功能。在我的实现中,我用OpenGL帧缓存来存储背面的渲染结果,用前面渲染来产生片段以开始光线投射过程。

所以为了计算光线投射结果我们需要创建一条光线然后在体数据中一步步跟踪。这全部可以在一个片段程序中完成,并且由GPU来运算。片段程序非常简单,唯一的难点是计算用来索引背面缓存的纹理坐标以得到光线穿出体数据的点。这些纹理坐标可以看成是标准设备坐标,在实现中我们通过下面的计算来在存储背面的缓存中找到对应的像素。

float2 texc = ((IN.Pos.xy / IN.Pos.w) + 1) / 2;

在上面的式子中,IN.Pos是经过模型视图投影之后的坐标位置,这个计算给出了片段屏幕位置,其值在0和1之间。这样光线出射点就可以通过用texc去索引存储背面渲染结果的缓存得到:

float4 exit_position  = tex2D(backface_buffer, texc);

现在我们完成了光线的创建,然后使用渲染模型3.0的循环功能来建立一个for循环。这个循环将会以一个特定的步进值delta在体数据中前进,根据体数据集的性质我们可以计算累计阻光度和颜色值。

【GPU编程】基于GPU的光线投射体绘制(GPU-Based Ray-Casting Volume Rendering)入门学习相关推荐

  1. matlab gpu 编程,实战:使用MATLAB进行GPU高级编程

    在GPU上执行能够加快我的应用程序吗? GPU能够对符合以下标准的应用程序进行加速: 大规模并行-计算能够被分割成上百个或上千个独立的工作单元. 计算密集型-计算消耗的时间显著超过了花费转移数据到GP ...

  2. GPU编程 CUDA C++ 分子动力学模拟【GPU加速版】迷你代码

    分子动力学模拟对一个具有一定初始条件和边界条件且具有相互作用(分子力场molecular force feild)的多粒子系统的运动方程进行数值积分,得到系统在相空间(phase space)中的一条 ...

  3. 基于VueAxios制作音乐播放器(bilibili黑马程序员Vue入门学习记录)

    目录 使用Vue制作一个音乐播放器 前言 Vue Vue导入 Vue挂载 Vue指令 v-text v-html v-on v-show v-if v-bind v-for v-model axios ...

  4. 基于c++ amp的gpu编程

    目录 摘要: 1 简介 2 性能改进 2.1 异构平台 2.2 gpu架构 2.3 通过平行的性能改进 3 gpu编程架构 3.1 opencl 3.2 cdua 3.3 c++ amp 4 一个c+ ...

  5. 学习笔记-《GPU 编程与CG 语言之阳春白雪下里巴人》

    第一章 绪论 1.1 Programmable Graphics Processing Unit 发展历程 Programmable Graphics Processing Unit( GPU),即可 ...

  6. GPU编程自学2 —— CUDA环境配置

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...

  7. GPU编程自学1 —— 引言

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...

  8. GPU编程优化篇-姜雪伟-专题视频课程

    GPU编程优化篇-169人已学习 课程介绍         本课程从可编程流水线到GPU内部运行原理一一给读者介绍,本课程涉及到的Shader编程技术都是实战中经常使用的,结合着案例讲解让读者更容易接 ...

  9. GPU编程自学5 —— 线程协作

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...

最新文章

  1. html5 支持php标签吗,HTML5标签大全
  2. 【Clique Problem】
  3. linux下lua开发环境安装
  4. Android 动态设置 layout_centerInParent
  5. 计算机编程方程求解的步骤,计算机解决问题的过程PPT学习课件
  6. 漫步数理统计十九——独立随机变量
  7. 北京西格玛大厦微软社区精英 Visual Studio 2010 技术交流会记录
  8. WebStorm——最智能的Javascript IDE
  9. 水晶报表基础入门——6.交叉报表设计技术
  10. 秒针国家统计局项目:我的一些感想和8点安全措施
  11. ISTQB认证考试攻略大全(2018版)
  12. hiveserver2 HA
  13. golang 实现苹果内购服务端验证
  14. 现代笑话二则 木子家创作
  15. 本学期3个sprint的团队贡献分
  16. 实数傅立叶变换和复数傅立叶变换
  17. 妹子读者小墨:一文和你聊透数据可视化!
  18. matlab显示图像全黑,请教!彩色图像显示出来怎么是全黑的?
  19. DVFS--动态电压频率调整
  20. 计算机SCI/EI期刊投稿经验

热门文章

  1. IO 端口和IO 内存(原理篇)
  2. 如何卸载ubuntu下的terminator
  3. [Matlab] 传入 dsolve 的方程组必须是行向量才能求解
  4. vue锚点定位(代码通用) - 总结篇
  5. 如何解决IE6的3像素问题?
  6. python如何画出多个独立的图使用turtle_从选项列表一次绘制多个形状(Python-Turtle图形)?...
  7. 苹果cms v10 仿电影淘淘PC+WAP模板
  8. 弹幕解析播放器json客户端解析后台管理源码
  9. html盒子标准模型,CSS——(二)盒子模型与标准流
  10. 华为鸿蒙系统明年8月份,华为鸿蒙系统明年上线,力争第五大操作系统,能否成功?...