虚幻4渲染编程(材质进阶篇)【第一卷:影视剧各种衣料--上】-程序员宅基地

我的专栏目录:

小IVan:专题概述及目录

专题概述:

最近古墓丽影新作看的人心里直痒痒,用最新的RTX技术,让整个游戏画面又提升了一个档次。但是里面的材质衣料都是欧美的东西,所以我打算在游戏里自己实现一下中国的一些高级材质。最近正逢一部清宫剧很火,里面的服饰道具都非常华丽,所以想以它为参考在游戏里实现剧中的各类材质(侵删)。


这一小节来研究一下剧中的各类衣料。不得不感叹中国的衣料真的比欧美高大上多了,我们在穿绫罗绸缎的时候西方人还在穿麻布(手动滑稽)。如有错误还请各路大神指正(比如把绸和缎混淆什么的)


首先我们需要知道绫罗绸缎的各类区别,知乎上刚好有一篇不错的讨论

绫、罗、绸、缎、丝、帛、锦、绢的区别是什么?

【一:吉服】

一起来实现富察皇后穿的这件吉服吧。距离太远看不清到底有没有用金线银线。皇后穿的叫“缂丝石青地八团龙棉褂。从光泽上看应该里面掺有除棉以外的其它材料。

v2-acc0329b1bceb8be2a1965f21f32d12a_b.jpg
图片来自网络

首先我们需要先把模型的大型做好,衣物大型是表现重点之一,我们先调好参数用cloth修改器,计算出一个还OK的模型出来。

v2-4e67d815e68b1a0ca1450d97cce29fb5_b.jpg

这件吉服的材质我使用迪士尼的那套BRDF。因为富察皇后的吉服非常细腻,衣服的纹理细节小到已经不能用法线表现了,所以使用Rouphness来表现这么细节的效果。小于0.5mm大小的细节使用Normal来表现都不太合适了。效果如下:

v2-3ea1250fbe13aa907d2b16f658912900_b.jpg

注意吉服的料子是青石色的。


【二:常服】

v2-1f0c090a7662479d245b6e1fbcad9b4a_b.jpg
图片来自网络

上图应该是锦或缎?质地比纱要硬一些,光泽度较高。我们还是使用迪士尼那套BRDF来模拟,在模型大型上可以把模拟参数的韧度调高些。因为这种材料的反射度较高,所以需要格外注意CubeMap。

v2-c1bcb2c513c25a96b3070cbfeef47a1b_b.jpg

常服中还有一种比较素的布料

v2-274706eca1ac875f7399c83f484cf9a8_b.jpg

我们算两次BRDF,第一次使用标准的,第二次算microfacet的,最后通过一个权重值插值在一起最后和DIffuse相加

v2-a06f4928acf6c49021fc67fb1433b995_b.jpg

还有一种是有各向异性高光+有一点点隐约透明纱状感觉的袍子

v2-a36ffaab1206a59cbeef80d4f3f9bf12_b.jpg

这种的话我们需要使用各向异性高光模型+OpacityMask。OpacityMask贴图的Clip值做小一点

v2-6d8634aa0bcd613953d85a66c83b1bce_b.jpg

【三:孔雀羽线】

v2-322cce1104ae4f8325f3e2e953eef7a1_b.jpg
图片来自网络

延禧攻略中提到的孔雀羽线是真实存在的。1958年的时候,北京定陵出土了一件“织金孔雀羽妆花纱龙袍”,是明朝万历皇帝穿的。之所以孔雀羽线会发出七彩光,是因为光的散射。要模拟这个效果我们需要动手改引擎的BRDF模型了。我们不需要管灯光摄进羽线做了什么事情,只管它出来之后的分布即可,可以看到从羽线射出来的光会被散射开。

把散射加到反射计算的F项中

v2-899cdcb7cb41a7f38d2f2a8f1630f5f7_b.jpg

最后就得到了孔雀羽线布料啦。

v2-1431c1363c767afbc757c0b7d0cfc20d_b.jpg

这个公式还不完美,还需要仔细再推敲推敲。

【四:丝绸,棉布,毛毯】

v2-8a117f0c09b85f14c0320684ef908b12_b.jpg

v2-834e1f8a71b625bae1b45a2263c10630_b.jpg

v2-34601bcd4e6beb920fcca4989797aed3_b.jpg

v2-70a6fb958e66c30581faa9fcd9ef1b4b_b.jpg

具体做法请看我上篇文章:zhuanlan.zhihu.com/p/37


剧中还有很多漂亮的材质,后面我们再慢慢实现他们 Enjoy It

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cpongo7/article/details/100779780

智能推荐

RabbitMQ延迟消息场景分析以及实现两种方式(SpringBoot)_rabbitmq messageproperties.setheader-程序员宅基地

文章浏览阅读846次。使用场景,不限于下面用户下订单结束,如果用户未及时支付,后续需要取消订单,可以怎么做?定时任务可以做,但是不能接近实时或者消耗数据库性能太大。【数据库定时任务方案】:定时任务可以做到订单的状态的改变,但是数据库定时任务是定时执行的,而我们订单状态改变的时间确是随时可以发生的,所以定时任务不能做到准实时。【消息中间件方案】:我们可以将消息投递到中间件里面,通常设置一个延迟时间,精确到某..._rabbitmq messageproperties.setheader

element-ui中form验证杂记-程序员宅基地

文章浏览阅读300次。最近接触的商户后台项目居多,自然而然就涉及到了大量的表单验证,也就对一些常用的el-form表单验证和问题进行下梳理。当我们添加required验证后,输入一些数据后再删除完时,会出现xxx is required,如下图所示你可能很纳闷,已经为form表单传入了rules了啊,在不全部删除时,验证规则都没问题。这个问题是因为在ht..._el-form validate promise

iOS关于日期格式化字符串的问题_ios 日期格式化必须和字符串一致吗-程序员宅基地

文章浏览阅读1k次。在写新浪微博时, 解析接口返回来的日期, 使用dateFromString转换成NSDate时总是nil首先: 新浪微博返回来的日期这这样的: Thu Feb 18 08:27:18 +0800 2016解析这样的日期格式需要将NSDateFormatter设置成这样的: EEE MMM d HH:mm:ss Z yyyy在iOS中解析新浪微博的日期格式,只_ios 日期格式化必须和字符串一致吗

Unity SteamVR获取手柄按钮触发事件_unity steamvr 手柄任意按键按下事件-程序员宅基地

文章浏览阅读1w次,点赞4次,收藏30次。在unity如何获取VR手柄的按钮1.首先创建一个C#Script并绑定在任意gameobect上,using UnityEngine;using System;using System.Collections;using System.Collections.Generic;using System.Collections.ObjectModel;using UnityEngine..._unity steamvr 手柄任意按键按下事件

安卓11 init初始化以及init.rc的解析执行过程详解_boringssl-self-check-failed-程序员宅基地

文章浏览阅读1.1w次,点赞28次,收藏64次。最近做了一个高通平台安卓的需求,功能使得data分区在第一次启动时,自动适配emmc/ufs的实际大小,在此过程中对init的执行以及.rc文件的解析流程有了一些理解,趁热打铁!!在这里总结一下!!!这里以mtk平台为例进行说明,基于安卓11,init这块的代码mtk与高通基本是一模一样的,都是中间层的东西; 对于init在整个系统中(宏观)的执行流程想必大家都很清楚了,init进程是linux内核启动后创建的第一个进程,地位非常重要,init进程在初始化过程中会启动很..._boringssl-self-check-failed

在 x86 上面交叉编译 gstreamer for ARM/MIPS_gettext arm 编译-程序员宅基地

文章浏览阅读2.3k次。gstreamer for ARM一:准备环境。1。 首先需要一个交叉编译器。如: /usr/local/arm-linux-gcc-3.4.3/安装的路径:/usr/local$ ls /usr/local/arm-linux-gcc-3.4.3/arm-linux arm-linux-uclibc bin bin-ccache include info _gettext arm 编译

随便推点

Android开发点滴 - 实现层级式导航(API 16+)_android studio层级式导航父页面自左至右出现-程序员宅基地

文章浏览阅读439次。在Jelly Bean(API 16)以前,为了实现顶部的导航菜单,程序员们不得不手工写代码,神马在OnCreate啊,神马onOptionsItemSelected啊,但是,现在一切都是浮云了。你需要做的只是在AndroidManifest中增加那么一小句话,指定父Activity就好了。我们来看下代码:...

react打包项目的时候页面空白_react打包为空白 vite.svg为空-程序员宅基地

文章浏览阅读781次。样式图并且控制台报错解决方法和问题原因路径错误,在weback.json里面添加成功图例个人github:https://github.com/webxingkong如有不正确的地方请指教联系修改,后期将不断更新,谢谢你们的支持..._react打包为空白 vite.svg为空

请查收!顶会AAAI 2020录用论文之知识图谱篇_知识图谱论文好发吗-程序员宅基地

文章浏览阅读5.2k次,点赞4次,收藏29次。2020年人工智能顶级会议AAAI录用的知识图谱领域的研究论文已为您准备就绪,请查收!_知识图谱论文好发吗

scapy 内 hexdump 详细使用_scapy hexdump-程序员宅基地

文章浏览阅读2.8k次。起因是之前我在做流量监视器的时候,因为tcp包是分开传输的,所以要想看到一个完整的http请求,需要把包内的内容合并到一起###[ TCP ]### sport = http dport = 2433 seq = 946575688 #这个值就是上一个的seq值加上上一次的传输大小 ack = 3616542016 dataofs ..._scapy hexdump

DetachedCriteria 分页Projection取消聚合条件 (解决方案)-程序员宅基地

文章浏览阅读498次。当我们在使用DetachedCriteria进行分页查询时,需要对DetachedCriteria对象设置setProjection(Projections.rowCount()。可此时我们还需要DetachedCriteria对象去查询分页的结果集,而DetachedCriteria给的方法没有像 removeProjection()这样的条件。。而我也不想去拷贝一个DetachedCriter..._detachedcriteria 分页

swift - 从指定路径的文件中读取数据_swift path读取data-程序员宅基地

文章浏览阅读7.2k次。1. 获取指定路径var dataArray:[[Substring]] = []let PathLossTable = "PathLossTable.csv".docConfigDir()print(PathLossTable)out:/Users/joshwang/Documents/App/Resources/PathLossTable.csv2.获取数据函数;input:指定文件路径 ..._swift path读取data