【GAMES101】Lecture 18 高级外观建模

2024-02-08 09:52

本文主要是介绍【GAMES101】Lecture 18 高级外观建模,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

外观就是材质,就是BRDF,然后对于不同的模型,这个材质的计算不太一样

目录

非表面模型

参与介质

头发

皮毛-动物毛发

颗粒材质(Granular material)

表面模型

半透明材质(Translucent material) BSSRDF

布料

Detailed material (non-statistical BRDF)

过程中程序生成外观(Procedural appearance)


非表面模型

参与介质

参与介质或者说散射介质,是指光线穿过这个介质时会被吸收和被散射,像这个云、雾、烟……

用一个函数,Phase Function,这个相位函数来描述参与介质散射光的性质,是往后集中散射、往前集中散射还是各向同性散射

 这个光线在参与介质里面走得越远就说明参与介质吸收光线的能力越强,怎么来渲染呢,还是用光线追踪的方法,让光线在里面弹射,然后相连各个弹射点,计算总路径的贡献

头发

 Kajiya-Kay模型把头发当作一个圆柱体,然后光线照射到头发上会形成这么一个圆锥形的散射

但是Kajiya-Kay模型的效果不是特别好

然后是Marschner模型,将散射的光线分成三种,R光线是一次反射,TT光线是从一个表面折射进去然后从另一个表面折射出来,TRT光线是先折射进去,在头发内部反射一次后折射出来

这个Marschner模型把头发当成玻璃的圆柱体,分成角质层(cuticle)和皮层(cortex),皮层含有色素会吸收光线,考虑三种光线和这个圆柱体的作用

效果很好

皮毛-动物毛发

这个动物的毛发如果直接用人的头发模型来做的话是左图的效果,右图是用动物皮毛模型的,这也是闫神做的模型(太厉害了)

结构决定性质,这肯定是因为动物的皮毛和我们的头发结构不一样所导致的,大家都有这个外面的角质层,里面吸收光的皮层,还有中间散射光的髓质,不一样的是我们人类的髓质比较小,而动物的髓质比较大

这个髓质大的话,毛发透光会更多

 于是就有人(闫神)就提出了这个双层的圆柱模型,加入了髓质部分

光线在原来的R、TT、TRT的基础上增加了散射穿过的TTS和散射反射出来的TRTS

效果是这样的

颗粒材质(Granular material)

有一些物体它是这个颗粒状的,这个计算量就非常大

但是可以做一些简化,比如把这个物体分成一些小单元,然后根据这个单元里面包含的颗粒材质的比例来计算整体

表面模型

半透明材质(Translucent material) BSSRDF

这个半透明材质指的是光线从物体表面某个点进去但是经过里面的反射后从物体表面另外的点射出来的材质,叫做次表面散射(Subsurface Scattering),像这个玉石、水母、牛奶,就是光照过去就会晶莹剔透的感觉,

这个性质可以在之前的BRDF上拓展成BSSRDF,这个SS指的是Subsurface Scattering,之前的BRDF只反映的从哪个方向来往哪个方向去,这里还需要加上从哪个点来往哪个点去

相应的渲染方程也要进行修改,因为从这个点冒出来的光不知道是来着哪个点的,所以还需要对所有的方向和面积进行积分

次表面散射的效果很像有一个光源在物体内部发光的效果,然后为了物理上的真实,人们推出只有底下这么个光源不够,还得有上面对称的一个光源,然后用这两个光源渲染的效果就很像次表面散射的效果,这个方法就叫Dipole Approximation

 然后人的皮肤也是类似的这样的透光材质,就可以用这个BSSRDF生成虚拟人物,非常逼真

布料

先来说一下这个布料的结构,由纤维缠绕成股,就是这个Ply,然后由股缠绕成线,就这个Yarn

 有了线之后就可以通过编织得到布料

对于这个布料有三种渲染方式

一个是根据这个布料的编织方式去定义好一个BRDF,当成表面来渲染

但是当成表面来渲染对于那些表面本身不像平面的布料像天鹅绒就不太好,所以有这种把它当成参与介质,把布料当成体积进行渲染,用很多细细块去切分纤维,根据里面纤维的分布和朝向计算整个块的性质,当成参与介质,像这个云烟雾来渲染

最后一种方法就是直接渲染每根纤维,暴力解决

Detailed material (non-statistical BRDF)

我们渲染出来的东西太完美了看起来反而不真实

因为在真实的世界中东西本身是不完美的,或许因为做工或许是因为磨损或许是因为完美本身就不存在

用这个微表面模型来说,最重要的是这个描述法线分布的D,之前用的都是简单的分布,像这个正太分布,都是连续函数

但是在真实世界中的样本分布它总是不连续的,会有很多的这种噪声存在,这才是真实的世界

但是这个渲染起来很难,为什么难呢,微表面模型中我们把每个微小表面都当成镜面反射,从摄像机打出光线到微表面上再反射出去,但是很难碰到光源

那怎么办呢,我就从一个像素出发把它覆盖到的一片微表面区域去计算出统一的一个法线出来再计算,唉但是这个解决办法和我刚刚遇到的打不到光源的问题有什么关系,好像没解决啊?闫神怎么不多解释一下T_T

由于这个光具有波粒二象性,当光遇到的物体尺寸大小和光的波长接近的时候就会发生波的现象,因此这个波动性也需要考虑

过程中程序生成外观(Procedural appearance)

这个和之前学的纹理应用中的程序纹理差不多,就是我不用事先存储整个物体的材质,而是要用的时候去动态查询,通过一个噪声函数,传入物体三维的位置得到一个值来用

这篇关于【GAMES101】Lecture 18 高级外观建模的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/690665

相关文章

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

Python实现数据清洗的18种方法

《Python实现数据清洗的18种方法》本文主要介绍了Python实现数据清洗的18种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1. 去除字符串两边空格2. 转换数据类型3. 大小写转换4. 移除列表中的重复元素5. 快速统

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

OCC开发_变高箱梁全桥建模

概述     上一篇文章《OCC开发_箱梁梁体建模》中详细介绍了箱梁梁体建模的过程。但是,对于实际桥梁,截面可能存在高度、腹板厚度、顶底板厚度变化,全桥的结构中心线存在平曲线和竖曲线。针对实际情况,通过一个截面拉伸来实现全桥建模显然不可能。因此,针对变高箱梁,本文新的思路来实现全桥建模。 思路 上一篇文章通过一个截面拉伸生成几何体的方式行不通,我们可以通过不同面来形成棱柱的方式实现。具体步骤