【GAMES101】Lecture 18 高级外观建模

news2024/9/24 19:20:11

外观就是材质,就是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)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1439292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

17:定时器编程实战

1、实验目的 (1)使用定时器来完成LED闪烁 (2)原来实现闪烁时中间的延迟是用delay函数实现的,在delay的过程中CPU要一直耗在这里不能去做别的事情。这是之前的缺点 (3)本节用定时器来定一个时间(譬如0.3s),在这个定时器定时时间内…

相机图像质量研究(8)常见问题总结:光学结构对成像的影响--工厂调焦

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

【DIY】断电报警电路,电源监控装置

这个微小的断电报警电路是一种电源监控装置,将掀起的压电扬声器当交流电网电源切断。这表明一些功率的关键仪器如安装在医院照料装置供电损失很有帮助。报警激活在正确的时间是有用信号有停电,应采取紧急行动提供了另一种供电恢复的情况。 这是一个9V电…

【开源】基于JAVA+Vue+SpringBoot的停车场收费系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 停车位模块2.2 车辆模块2.3 停车收费模块2.4 IC卡模块2.5 IC卡挂失模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 停车场表3.2.2 车辆表3.2.3 停车收费表3.2.4 IC 卡表3.2.5 IC 卡挂失表 四、系统实现五、核心代码…

【http】2、http request header Origin 属性、跨域 CORS、同源、nginx 反向代理、预检请求

文章目录 一、Origin 含义二、跨源资源共享:**Cross-Origin Resource Sharing** CORS2.1 跨域的定义2.2 功能概述2.3 场景示例2.3.1 简单请求2.3.2 Preflighted requests:预检请求 2.4 header2.4.1 http request header2.4.1.1 Origin2.4.1.2 Access-Con…

上海泗博HART转ModbusTCP网关HME-635应用案例之组态王和超声波液位计通信

如今工业现场的应用也逐渐把现场的不同应用协议转换成以太网,以此来提升现场的通信速度和质量。Modbus TCP是工业以太网协议的一种,也是现场应用中最常使用的。本应用案例是基于Modbus TCP的组态王和基于HART的超声波液位计之间数据通讯的具体应用。 应用…

ruoyi-nbcio中xxl-job的安装与使用

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址: http://122.227.135.243:9666 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbach…

u8 bit0 :1; “:”位字段的声明(也称为位段)

在C语言中,冒号(:)用于声明bit字段,也称为位域(Bit-field)。位域允许我们在结构体中对结构成员进行位级的精确操作,主要用于对寄存器和硬件操作进行描述和访问。冒号后面的数字表示该位域的位宽度。 在通信中&#xff…

浅谈垃圾回收、内存泄漏与闭包

什么是垃圾? 在js中,垃圾通常指的是不再被程序使用的内存或对象。也就是说,垃圾是指程序中分配的内存空间或对象,但不再被程序使用或无法被访问到的内容 function createIncrease() {const doms new Array(100000).fill(0).map((…

Excel——合并计算

1.表格的合并计算(单张表格/多个表格) Q:请统计两个表格中各商品的总销量和总销售额,将结果放置在下方任意位置。 A:选择一个需要将合并计算数据放置区域的空白单元格 选择【数据】——【合并计算】,【函…

C语言的循环结构

目录 前言 1.三种循环语句 1.while循环 2.for循环 2.1缺少表达式的情况 3.do while循环 2.break语句和continue语句 2.1在while循环中 2.2在for循环中 2.3在do while 循环中 3.循环的嵌套 4.go to语句 前言 C语⾔是结构化的程序设计语⾔,这⾥的结构指的是…

【51单片机】实现一个动静态数码管显示项目(前置知识铺垫,代码&图演示)(5)

前言 大家好吖,欢迎来到 YY 滴单片机 系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY…

数据库管理-第147期 最强Oracle监控EMCC深入使用-04(20240207)

数据库管理147期 2024-02-07 数据库管理-第147期 最强Oracle监控EMCC深入使用-04(20240207)1 发现Exadata2 Exadata监控计算节点:存储节点RoCE交换机管理交换机PDU 总结 数据库管理-第147期 最强Oracle监控EMCC深入使用-04(202402…

图数据库 之 Neo4j - Browser 介绍(3)

Neo4j Browser 介绍 Neo4j Browser 中有 3 个模块,侧边栏,Cypher 编辑器与结果栏,在进入 Neo4j Browser 时结果栏会展示欢迎界面。 Cypher 编辑器 Cypher 是一种图形查询语言,用于查询和操作图形数据库。它是 Neo4j 图形数据库的…

【C++第二阶段】友元

你好你好! 以下内容仅为当前认识,可能有不足之处,欢迎讨论! 文章目录 全局函数做友元类对象做友元成员函数做友元 全局函数做友元 What 在全局函数中,可以访问类中private权限下的成员属性。 How 在类对象中&#…

微软.NET6开发的C#特性——接口和属性

我是荔园微风,作为一名在IT界整整25年的老兵,看到不少初学者在学习编程语言的过程中如此的痛苦,我决定做点什么,下面我就重点讲讲微软.NET6开发人员需要知道的C#特性。 C#经历了多年发展, 进行了多次重大创新&#xf…

Java面向对象 继承

目录 继承继承的好处继承具有传递性实例创建Person类Student继承Person类测试 继承 Java中的继承是面向对象编程的一个核心特性,它允许一个类(子类或派生类)继承另一个类(父类或基类)的属性和方法。通过继承&#xff0…

mysql 对于null字段排序处理

最近遇到一个需求 ,需要对一个报表的多个字段进行多字段复杂条件排序 排序字段为NULL时 Mysql对于排序字段为NULL时,有自身默认的排序规则,默认是认为null 值 是无穷小 ELECT id,script_id,last_modified,live_count,next_show FROM virtua…

PKI - 05 证书申请步骤

文章目录 Pre概述第一步:时间同步第二步: 部署证书服务器第三步: 客户端产生密钥第四步: 验证证书服务器第五步: 申请个人证书第六步: 审核并签名证书第七步: 颁发数字证书第八步: 交换公钥 Pre PKI - 02 对称与非对称密钥算法 PKI - 03 密钥管理(如何…

Docker Compose实例

目录 一、前提说明 二、简单的Docker容器部署案例 1. Dockerfile 配置 2. docker-compose.yml 配置 3. application.properties 配置 4. pom.xml 配置 5. 上传文件 6. 创建基础Docker镜像 7. docker-compose.yml编排 8. 停止并删除容器编排 一、前提说明 在配置好Do…