张亚坤

来自CGTWiki
跳转至:导航搜索
18867371178 (1).jpg

个人简介


生于1993年9月20日,籍贯河北省邯郸市。

2014级         湘潭大学             信息工程学院             通信工程          本科
2020级         北京邮电大学         信息光子学与光通信院     电子信息          研究生

主要研究方向是三维显示和计算机图形学

四级成绩:472
Tel: 18867371178
Email: 976280834@qq.com

早会

  • 9.22整改体感交互漫游

周报

  • 9.22

OSG->handle()重写该虚函数,嵌入leap代码并已调通,实现了场景视角控制到达漫游效果。

  • 9.15

(1)改换V3版本3.2.1SDK结合OSG回调机制代码调通
(2)简单演示效果展示,左手模型牛逆时针,右手牛模型顺时针;后续将已写好的代码功能进行移植并完善。


  • 9.8
(1)WPF等非unity项目中需leap官方2.3.1版本SDK,动态库为.NET4.0,多次测试与平台框架.NET4.7.2兼容

(2)实现选中、缩放、移动视角交互功能;
(3)遇到问题:代码移植平台后无法实现与leapmotion设备的连接。尚未解决
已尝试的解决办法:

(1)检查项目属性,重新引用sdk中lib/x64目录下LeapCSharp.NET4.0.dll;重新添加下Leap.dll、Leap.lib、LeapCSharp.dll,并始终复制到输出目录
(2)方案中新建类库,项目中引用新建类库仍无法连接
  • 7.14
  • 图标显示功能完善,可任意位置添加不同图标,并可对选中图标进行删除或文字编辑。
  • 尚存问题,加入选中单个图标进行空间移动功能时出错,预计周四上午解决。
  • 7.8

(1)实现了在unity中经纬度与位置坐标的转换,给定物体经纬度即可确定该物体在场景中的位置;
(2)安装破解unity5.3.8和相关插件

  • 4.16

(1)安装leapmotion驱动器和基于unity的SDK
(2)在unity中实现了不同手势控制物体旋转,平移,缩放;
存在问题:旋转平移缩放,单个调试效果理想;一起调试存在动作识别误差,物体不易控制;
解决方式:目前针对各动作灵敏度和手势阈值进行优化

  • 4.9

(1)熟悉C++,ue4。
(2)学完GIS视频1-10讲。

  • 4.2

安装了银河麒麟服务器操作系统V10_AMD64版,并上传到ftp。
(1)操作体验:Kylin OS 基于Linux开发,与Lniux系统较为相似,系统流畅。
(2)存在问题:root用户下与自建用户下都无法使用终端命令进行软件安装,仍在查找原因。

leapmotin个人进展

  • 4.21今日完成选中操作,周四进行各动作共同调试并上传运行效果
  • 4.22左手(竖直扇动)选中单个物体(白色物体为选中)之后,可对其进行移动和缩放。

手势
(1)左手竖直闪动选择物体;
(2)右手握拳拖动物体;(平移)
(3)左右手食指大拇指捏合,靠近时物体缩小,远离时物体放大;
运行效果如视频所示


下一步完善并加入旋转操作
5.14加入旋转与眼位调整
运行效果如视频所示


六种手势
(1)右手拇指控制Cam旋转(2)右手食指控制Cam移动
(3)左手拇指控制物体旋转(4)左手食指控制物体移动
(5)双手捏合物体缩放 (6)左手摆动进行选择物体

PBR笔记

PBR之所以认为是基于物理的是因为满足下面的三个条件:
1. 基于微表面模型
2. 满足能量守恒
3. 使用基于物理的双面反射分布函数(BRDF)

(一)微平面理论
大多数PBR技术都是基于微平面理论。在此理论下,认为在微观上所有材质表面都是由很多朝向不一的微小平面组成,有的材质表面光滑一些,有的粗糙一些。
插图1.1
所有材质表面由粗糙度不同的微小平面组成。左边材质更粗糙,右边的平滑一些。当光线射入这些微平面后,通常会产生镜面反射。对于越粗糙的表面,由于其朝向更无序,反射的光线更杂乱,反之,平滑的微平面,反射的光线更平齐。
插图1.2
上图左边材质表面更粗糙,反射的光线更杂乱;图右的平滑许多,反射的光线更有规律。
从微观角度来说,没有任何表面是完全光滑的。由于这些微平面已经微小到无法逐像素地继续对其进行细分,因此只有假设一个粗糙度(Roughness)参数,然后用统计学的方法来概略的估算微平面的粗糙程度。可以基于一个平面的粗糙度来计算出某个向量的方向与微平面平均取向方向一致的概率。这个向量便是位于光线向量l和视线向量v之间的中间向量,被称为半角向量(Halfway Vector)。
半角向量h是视线v和入射光l的中间单位向量,其计算公式如下:

\[h = \frac{l + v}{\|l + v\|}\]

多的微平面取向与其半角向量一致,材质镜面反射越强越锐利。加上引入取值0~1的粗糙度,可以大致模拟微平面的整体取向。粗糙度从0.1~1.0的变化图如下,看以看出粗糙度越小,镜面反射越亮范围越小;粗糙度越大,镜面反射越弱。
半角向量计算GLSL实现:
代码示例1.1
(二)能量守恒
反射和折射光线的不同也给我们另外一个角度来看待能量守恒:这两种光线是互斥的。也就是说,反射的部分的光线能量就不能被材质吸收。因此,能够被用来计算进入材质内部的折射光的能量是我们计算过反射光线之后剩余部分的能量。为了保证这个能量守恒的关系,我们先计算入射光线中镜面反射的部分,另外一部分的折射光线可以直接从镜面反射部分计算得出(折射比例= 1-镜面反射比例)。 使用这种反射和折射分开的办法,可以保证漫射(refracted/difuse)和镜面反射(reflected/specular)的和不会超过1,也就确保了他们的能量的总和不会超过入射光线的能量,而这是我们以前的传统方式不会考虑的。
代码示例2.1
通过以上代码可以看出,镜面反射部分与漫反射部分的和肯定不会超过1.0,从而近似达到能量守恒的目的。
(三)反射方程
渲染方程(Render Equation)是用来模拟光的视觉效果最好的模型。而PBR的渲染方程是用以抽象地描述PBR光照计算过程的特化版本的渲染方程,被称为反射方程。
PBR的反射方程可抽象成下面的形式:

\[L_o(p,\omega_o) = \int\limits_{\Omega} f_r(p,\omega_i,\omega_o) L_i(p,\omega_i) n \cdot \omega_i d\omega_i\]

fr 就是双向反射分布函数(Bidirectional Reflectance Distribution Function, BRDF),它的作用是基于表面材质属性来对入射辐射度进行缩放或者加权。
3.1双向反射分布函数(BRDF) 双向反射分布函数(Bidirectional Reflectance Distribution Function,BRDF)是一个使用入射光方向ωi作为输入参数的函数,输出参数为出射光ωo,表面法线为n,参数a表示的是微平面的粗糙度。
实时渲染管线使用Cook-Torrance BRDF,Cook-Torrance BRDF分为漫反射和镜面反射两个部分:

\[f_r = k_d f_{lambert} + k_s f_{cook-torrance}\]

kd是入射光中折射比例,ks是镜面反射比例。
flambert表示的是漫反射部分,叫做伦勃朗漫反射(Lambertian Diffuse)。它类似于之前的漫反射着色,是一个恒定的算式:

\[f_{lambert} = \frac{c}{\pi}\]

其中c代表的是Albedo或表面颜色,类似漫反射表面纹理。除以π是为了规格化漫反射光,为后期的BRDF积分做准备。
Cook-Torrance为BRDF的高光(镜面反射)部分:

\[f_{cook-torrance} = \frac{DFG}{4(\omega_o \cdot n)(\omega_i \cdot n)}\]

Cook-Torrance镜面反射BRDF由3个函数(D,F,G)和一个标准化因子构成。D,F,G符号各自近似模拟了特定部分的表面反射属性。
D(Normal Distribution Function,NDF):法线分布函数,估算在受到表面粗糙度的影响下,取向方向与中间向量一致的微平面的数量。这是用来估算微平面的主要函数。
F (Fresnel equation):菲涅尔方程,描述的是在不同的表面角下表面反射的光线所占的比率。
G (Geometry function):几何函数,描述了微平面自成阴影的属性。当一个平面相对比较粗糙的时候,平面表面上的微平面有可能挡住其他的微平面从而减少表面所反射的光线。
3.1.1法线分布函数
法线分布函数使用统计学的方法近似计算微表面对齐于半角向量h的比例。众多不同版本的实现中使用Trowbridge-Reitz GGX的实现:

\[NDF_{GGX TR}(n, h, \alpha) = \frac{\alpha^2}{\pi((n \cdot h)^2 (\alpha^2 - 1) + 1)^2}\]

h表示中间向量,n表示法向量,α表示表面粗糙程度。
3.1.2菲涅尔方程
光线投射到表面时,基于表面法线和观察方向的夹角,菲涅尔方程计算出反射光线的比例。根据这个反射的比例和能量守恒我们可以直接计算出发生折射的光线的能量的比例。所以菲涅尔方程用来描述反射部分和折射部分的光线的比例,而这个比例根据我们观察表面的角度不同而不同。
菲涅尔方程可以使用Fresnel-Schlick来近似:

\[F_{Schlick}(h, v, F_0) = F_0 + (1 - F_0) ( 1 - (h \cdot v))^5\]

Fo表示平面基础反射率,N为法线向量,V为观察向量。
3.1.3几何方程
几何函数模拟微平面相互遮挡导致光线的能量减少或丢失的现象。
插图
类似NDF,几何函数也使用粗糙度作为输入参数,更粗糙意味着微平面产生自阴影的概率更高。几何函数使用由GGX和Schlick-Beckmann组合而成的模拟函数Schlick-GGX:

\[G_{SchlickGGX}(n, v, k) = \frac{n \cdot v}{(n \cdot v)(1 - k) + k }\]

这里的K是对表面粗糙度a的重映射,根据我们的几何函数是用于直接光源还是IBL光照有不同的计算方式:

\[k_{direct}=\frac{(\alpha + 1)^2}{8}\]

\[k_{direct}=\frac{\alpha^2}{2}\]

为了有效地模拟几何体,我们需要同时考虑两个视角,视线方向(几何遮挡)跟光线方向(几何阴影),我们可以用Smith函数将两部分放到一起:

\[G(n, v, l, k) = G_{sub}(n, v, k) G_{sub}(n, l, k)\]

3.2Cook-Torrance 反射方程
Cook-Torrance反射方程中的每一个部分我们我们都用基于物理的BRDF替换,可以得到最终的反射方程:

\[L_o(p,\omega_o) = \int\limits_{\Omega} (k_d\frac{c}{\pi} + k_s\frac{DFG}{4(\omega_o \cdot n)(\omega_i \cdot n)})L_i(p,\omega_i) n \cdot \omega_i d\omega_i\]

代表Fresnel 方程的F已经描述了表面反射的比例,即反射方程的反射部分已经暗含了反射比率ks,因此最终的反射方程为:

\[L_o(p,\omega_o) = \int\limits_{\Omega} (k_d\frac{c}{\pi} + \frac{DFG}{4(\omega_o \cdot n)(\omega_i \cdot n)})L_i(p,\omega_i) n \cdot \omega_i d\omega_i\]

该方程完整地定义了一个基于物理的渲染模型(PBR)
(四)PBR的GLSL实现
由浅入深学习PBR的原理与实现 OSG-VS项目配置
项目属性-配置属性-VC++目录(包含目录+库目录);链接器-输入—Debug+Rlease添加依赖项

FPS测试结果

  • 电脑配置:i7-10750H 16G GTX1650Ti 144HZ
  • 不同视点数、面片数、分辨率对帧率的影响测试结果图:
视点数对帧率的影响.png


面片数对帧率的影响.png


分辨率对帧率的影响.png