出于3D计算机图形学和图形渲染方面的个人兴趣,脑子里便萌生出了自己实现一个渲染器的想法,主要是借助pathtracing这种简单的算法,外加GPU加速来实现,同时也希望感兴趣的朋友们能够喜欢,也欢迎提出一些更好的看法~~。

(本人水平有限,若有错误也请指正~)

首先列个提纲......:

1)局部光照与全局光照简介

2)GPU并行运算在图形渲染的应用

—————————————————————————————————————————————————

1)pathtracing算法简介:

  在利用计算机表达现实生活景物的思想逐渐成型时,人们最初是利用所谓的局部光照模型来进行物体表面着色的,这种光照模型只能算得上是预览品质,在当时计算能力不高的硬件水平上已经能够达到一个比较满意的效果,这里我们要记住两个人,一个是Phong,一个是Lambert,前者推导出了理想漫反射表面对入射光所遵从的物理模型,后者提出了一个渲染物体表面高光质感的视觉近似模型。这里我们要提前做一些符号约定:规定所有的单位向量均由物体表面内部指向外部,由光线击中处O向光源引出的单位向量记为L,O向视线引出的单位向量为E,O向镜面反射方向的方向引出单位向量,记为R,由O出发指向外侧垂直于O所在表面的单位向量为N,即法线。

  Phong的模型:Phong给出了漫反射表面遵从的物理模型公式,即设漫反射光线强度为I(介于0与1之间),则I正比于E与L之间所成角的余弦值,由于均为单位向量,则

  实际中对比例系数再次进行定义以便更好描述物体表面属性,增加Kd与Id,这里的d为diffuse的缩写,Kd即为漫反射表面自身对光线的反射程度,1表示所有的光不吸收,全部进行漫反射,0则吸收所有入射光,对外呈现纯黑色,Id则为入射光强度,也是介于0~1之间,则

  Lambert模型:Lambert解决了物体表面的高光反射的问题,给出了视觉近似公式,随物体表面粗糙程度的不同,入射光线的所有可能的出射方向由理想镜面反射方向到理想漫反射方向之间过渡,Lambert近似给出在过渡过程中的视觉变化,其公式为

  位于指数次幂的n代表了物体的光滑程度,n越大,则物体表面越光滑,相当于视向量E对于镜面反射向量R越敏感。

  为了更好的描述物体表面,将这两项相加即可,I=Id+Is,所表现的物体表面既有高光反射质感,不进行高光反射的地方可以利用漫反射公式对其进行着色。

  以上所述的两种着色方式是局部光照模型的典型代表,这里的“局部”含义即为:物体表面的亮与暗仅与着色处的一些参量有关,而与场景中其它物体的反射,遮挡等等其它因素均无关,当对下图所示情况进行着色时,局部光照模型无法给出图示处的阴影现象。

  光在场景中的传输过程的本质是很简单的,折射(透射),反射,吸收。其中的反射又可分为漫反射,高光反射与镜面反射,这三种反射是由于物体表面光滑程度的不同而来的。但是,由于现实生活中场景的复杂程度变化多样,这就造成了一些常见的现象:溢色与焦散现象,溢色即如下左图所示(图片来源于网络):红色的物体反射的光线射向墙面使得白色的墙面染上了红色,如同颜色“溢出”到其它物体一样。焦散现象如下右图(图片来源于网络),本质是透射物体对光线的汇聚与分散作用。

  而上述现象对于传统的局部光照模型来讲是无法实现的,全局光照模型则是为了解决上述问题和出于真实感渲染的目的应运而生的,全局光照模型考虑的是光线在场景中如何传输并与场景中的物体进行物理拟真交互的问题,从而得到一张真实度很高的渲染成品,常见的一些全局光照的手段有:基于光子贴图(Photon Mapping)的方法,基于路径跟踪(Path Tracing)的方法,这两种方法,前者从光源处发射光子,并记录光子在场景中传输所产生的记录,后者则是从视线出发对场景进行采样,可以说这两种方法的思路是相反的,但对于表现真实感的场景,都是很好的算法,而且已经应用了很长时间。

2)GPU并行运算在图形渲染的应用:

  GPU的概念最初是由NVIDIA提出的,也就是我们所说的“显卡”,现在的显卡已经由一个传统的游戏设备,逐渐往通用计算领域发展。对于传统游戏设备,现代的GPU能够通过像OpenGL和Direct3D这种即时图形API在屏幕上呈现出即时影像,CPU通过这些API,经由底层驱动给GPU发送绘图数据和绘图指令等等。而对于通用计算领域,CPU则可以通过像CUDA,OpenCL这类API给GPU发送计算指令,计算得到的数据传回CPU进行后续处理。CUDA是NV的,而OpenCL则是一个开放的标准,AMD,Intel,Apple都支持这个标准,目的是利用上任何一个能够参与计算的设备,通用性比CUDA强,但是其效率没有CUDA高。上述的两种全局光照算法均可以在GPU上得以实现,且实现的效率能够超过GPU约两个数量级,这归功于GPU的并行设计理念。而且随着GPU硬件的不断发展,GPU的一些硬件优势也得以体现,如今的GPU的双精度浮点运算能力都要比CPU快很多倍,单精度则更快,同时GPU的显存是没有分页机制的,内部带宽也很高,因此访存延迟要比CPU少很多。这就是在某些场合下,为什么GPU的速度能够远超CPU的原因。

一步一步实现基于GPU的pathtracer(一):基础的更多相关文章

  1. 一步一步实现基于GPU的pathtracer(三):path tracing 简述

    全局光照这个名词在计算机图形学里已经不算一个新名词了,现在一提到拟真度,很多人基本上都会去想到全局光照,这个名词上世纪七八十年代就有了,好像是由一个叫Jim Kajiya的大神在他那篇已经被引用了不知 ...

  2. 一步一步实现基于GPU的pathtracer(二):求交算法

    不管是哪种全局光照算法,最根本的都要落实到光线与物体的求交.主要分为光线与参数曲面和非参数曲面的求交,典型的参数曲面有球.盒.圆柱等基本体及基本体的组合体,以及一些更为复杂的参数曲面.非参数曲面就是所 ...

  3. 一步一步搭建基于ffmpeg和sdl2的流媒体播放器

    一.  背景: 一步一步从资料收集.技术选型.代码编写.性能优化,动手搭建一款支持rtsp.rtmp等常用流媒体格式的视频播放器,ffmpeg用于流媒体解码,sdl2用于视频画面渲染和声音播放. 二. ...

  4. 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计

    本帖最后由 xinxincaijq 于 2013-1-9 10:27 编辑 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计 转自博客:http:// ...

  5. 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布

    之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr

    目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务电 ...

  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理

    状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实 ...

  8. 通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务

    我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓"stateful applications"真正具体的一个实现(个人认为),上一章讲到有状态服务可能很 ...

  9. 通过Dapr实现一个简单的基于.net的微服务电商系统(七)——一步一步教你如何撸Dapr之服务限流

    在一般的互联网应用中限流是一个比较常见的场景,也有很多常见的方式可以实现对应用的限流比如通过令牌桶通过滑动窗口等等方式都可以实现,也可以在整个请求流程中进行限流比如客户端限流就是在客户端通过随机数直接 ...

随机推荐

  1. TCP/IP笔记(六)TCP与UDP

    终于来到了传输层,这个面试问的最多了,内容比较多,要分两篇来总结,这是第一篇

  2. 基本数据结构——堆(Heap)的基本概念及其操作

    基本数据结构――堆的基本概念及其操作 小广告:福建安溪一中在线评测系统 Online Judge 在我刚听到堆这个名词的时候,我认为它是一堆东西的集合... 但其实吧它是利用完全二叉树的结构来维护一组 ...

  3. 串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧

    串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧 本例程中用51单片机作为Modbus从机,从机的设备地址为2,从机有4个寄存器, ...

  4. java集合框架(hashSet自定义元素是否相同,重写hashCode和equals方法)

    /*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不一致,元素不可以重复 * (通过哈希值来判断是否是同一个对象) * ----HashSet:底层数据结构是哈希表, * 保证 ...

  5. 详解 Node + Redux + MongoDB 实现 Todolist

    前言 为什么要使用 Redux? 组件化的开发思想解放了繁琐低效的 DOM 操作,以 React 来说,一切皆为状态,通过状态可以控制视图的变化,然后随着应用项目的规模的不断扩大和应用功能的不断丰富, ...

  6. LINQ TO XML初步了解

    最近简单的学习了一下LINT TO XML,写篇博客在这,方便以后查看~~ 1.常用到的类   XmlDocument --    文档(xml文件)     XmlElement    --     ...

  7. PMBOK 学习与实践分享视频

    本系列为自己在学习PMBOK时进行的总结与分享,每一节主要包括两部分: 对PMBOK本身的一个结构笔记和讲解. 对自己项目管理工作的一个总结和思考. PMBOK 学习与实践分享视频内容清单 人力资源管 ...

  8. python字符串实战

    haproxy配置文件 思路:读一行,写一行 global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 info defa ...

  9. Angularjs快速入门(一)

    这系列是看<用angularjs开发下一代web应用>的笔记. angular也接触几个月,总觉得不甚明白,写起来总是不那么如意.希望这本书看完了可以改变现在的状况.好了废话不多说开始: ...

  10. 安卓和iOS移动APP开发设计应该考虑哪些问题

    应该考虑哪些问题 现在用移动设备上网的用户越来越多,企业也可以从移动APP端挖掘潜在用户,想要设计好一款移动APP,我们需要考虑哪几个问题呢? 首先 我们应该先确认清楚企业的移动互联网战略目标是什么? ...