unity 获得当前物体_Unity光线追踪实践

本文探讨了Unity中实现光线追踪的原理和步骤,包括光线追踪原理、Unity API使用、光照系统参数、软阴影和体积光渲染。通过实例展示了不同光线追踪效果,并提出了未来优化方向,如GPU加速和自发光物体的体积光渲染改进。
摘要由CSDN通过智能技术生成

0b001bd1f63200c9c3275e9209cf602a.png

NVIDIA前段时间推出了NVIDIA RTX,使得光线追踪这一古老而又年轻的技术再次进入人们的视野,相比传统的光栅化算法,光线追踪更加符合数学家对物理世界的描述,得益于这个技术我们能在游戏或者电影里面看到更加炫酷,更加真实,更激动人心的画面。本文立足于Unity渲染API,以及Real Time Rending等参考资料,意在说明实现一个简单的光线追踪渲染器需要注意的点和主要的模块,主要用于技术探索和交流。(文章所用原理图片来自网络)

1.光线追踪原理

1.1渲染方程

渲染方程可以简单理解为:在一个光照环境中,一个物体w在不同观察方向上的光照强度分布情况。本文后面的光照模型,phone模型等,都是对这个方程的简单模拟。

558712af81e396c59f43bcd60f867208.png

947a89e58c3cbb6ff1afce11fb338acd.png

eec40057de72ab30bca90ae105da9f67.png

渲染方程中,x为当前的物体,L(x,w) 表示,在x处,沿着w方向射出的光照强度,Le为自发光,后半部分是反射光。方程里面的坐标表示都是球坐标。,球坐标的解释如下,具体的计算和推导细节请读者参考其他资料。

af1c3ab3163c248a92503820ce0059f3.png

物理学中通常使用的球坐标(r, θ, φ)(ISO 约定):径向距离 r,极角θ (theta) 与方位角φ (phi)。在数学里,球坐标系(spherical coordinate system)是一种利用球坐标表示一个点P在三维空间的位置的三维正交坐标系。右图显示了球坐标的几何意义:原点与点P之间的径向距离(radial distance),原点到点P的连线与正z-轴之间的极角(polar angle),以及原点到点P的连线在xy-平面的投影线,与正x-轴之间的方位角(azimuth angle)。它可以被视为极坐标系的三维版本。

1.2光线追踪过程

严格来讲,光线追踪应该叫做视线追踪,其本质是逆物理过程,这里的物理过程指的是:光线从光源发出,照射到物体上面通过屏幕进入相机,从而能够成像。光线追踪就是假设从摄像机发射一束视线穿过屏幕到物体上,观察这个地方的光照结果,并且把这些结果叠加从而作为屏幕上当前点的颜色信息。这里光照结果大体分为两个部分,第一个部分指的是光照直接投射到物体上产生的结果,第二个部分指的是其他物体发出的光线对该物体的影响,这时候就需要对其他物体递归使用视线追踪,最终把结果叠加。在本文中,光线的产生和相交运算采用Unity Api,主要是Physica.Raycast模块,为了更好的性能这一部分操作理应在GPU中进行,这也是笔者后面的优化方向。

6e2b4d9188926f88dcee4fa17a9ef44f.png

2.Unity常见API和概念

  • onRenderImage

当图像已经渲染完成,相当于后期处理,这里能够拿到原始的图片,然后通过3d数据进行图像的修正。这个函数可以访问当前正在渲染的图像。这个函数只出现在Camera上的脚本

  • Graphics.Blit

后期处理的过程:在onRenderImage里面拿到当前的渲染图像,然后Blit传递给shader进行渲染,渲染完成之后会再次通过onRenderImage进行回调,这时候可以通过Blit函数渲染到屏幕上。sourceTexture会成为material的mainTexture。Blit(sourceTarget,des,material),渲染的时候会使用material里面的shader。

  • Mesh

Mesh,网格 。 MeshFilter 用于获取网格数据的组件。MeshRender,用于渲染网格的组件。因为mesh可能被多个模型使用,mesh是每个模型单独的,sharedMesh则指的是共享的mesh,修改之后所有使用的mesh都会进行改变。Mesh实际上是三角形的点和边的集合。

  • ComputeShader

需要判断ComputeShader是否支持,ComputeShader不能挂在mesh上面,只能在脚本里面调用。SetTexture 传递数据,Dispatch 函数名字,线程组个数,每个线程组的线程数目,每次处理的像素个数,StructBuffer可以双向传递数据albedo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值