虚幻4模型提取_【UnrealEngine4】从虚幻四的着色模型到NPR

本文主要分享虚幻四中着色器的使用技巧与如何添加自己的着色模型的方式。

(正在设计的一个像素风格的渲染流程,同样采用本文的方法,对引擎的着色模型进行了改造,可以接受天光/点光等的自定义照明效果)

鄙人消失了一个月左右,又回来了,对此深感抱歉。之前因为学业/事业/身体/等各种原因,之前的系列文章也中断了一段时间~之前应该是讲到了流体的部分,由于数学性/图形学性较强,鄙人也还在准备当中。

本周先插播一小段技巧,同样也是实用的技巧,希望能够分享给大家。

二.材质中的伪体素

三.在虚幻四中基於NS方程的流體模擬

2.NS方程的解析和实际模拟

四.metaball 的原理与在材质中的实现

五.在虚幻四中 path tracing

1.相机内参、简单物体变换信息的处理

2.path tracing的解析,temporal的思路

3.在材质中进行path tracing

六、透明物体的渲染/造假技巧

特别篇目:

一、NPR与虚幻四的着色模型(本文)

二、一些后期处理的原理与解析

本文的目标:在虚幻四中插入自定义的着色模型,理解虚幻四中延迟渲染的流程。鄙人仅仅分享一种简单的做法,不代表最优做法/官方做法,分享仅此为了让一些很多人都存在的疑问得以解决。

(Cel Shading,对全部光源都适用的(而不是在材质编辑器里只能通过蓝图手动传入的那种。。。))

文章结构:

一.GBuffer的结构

二.虚幻中Shader.usf的内部关联

三.插入自定义着色模型

一.GBuffer的结构

虚幻四大多时候使用延迟渲染,而前向/延迟渲染的最大区别,可能就是GBuffer的使用与否。

GBuffer,全称Geometry Buffer,事实上这个定义很早被定下,而实际上如今的意思已经远超原本的意思(虽然这个东西不重要,还是稍微提一下)

这里将解析一下虚幻四默认的GBuffer的结构。

首先,需要了解虚幻四延迟渲染的流程。

GBuffer的本质是送信者,将信息传递给最终的着色部分。而实际上信息提供者是Mesh,把信息给送信者的是材质,也就是说,材质是中介的中介(可能有点绕了)。

换句话说,虚幻的普通域的材质实际上写入的是GBuffer,而不是最终结果。

其次,再整理一下各种东西之前的关系。

A:场景物体

B:材质/材质编辑器输出

C:BassPixelPass(后面会提到

D:GBuffer

E:FinalPixelPass(最终根据各种着色模型输出到屏幕的Pass

渲染顺序一般为

A->B->C->D->E

最后,稍微提一下虚幻四中默认的GBuffer的排布.

本文旨在插入“新的”着色模型,基本的DiffuseColor/SpecularColor/Metalic/Specular/AO/WorldNormal什么的不再具体阐述(毕竟需要修改的地方很少,默认的即可。)

在不知道什么版本更新了Cloth/Eye/ClearCoat 的着色模型之后,GBuffer里多了一个八位四通道的的CustomData,也就是说,这个CustomData是可以被使用而不影响原有的渲染流程的。接下来,鄙人将分享一下,怎么插入自定义的着色模型,和利用这个插槽来增加参数。

GBuffer.CustomData

(他在shader里的出现形式是这样的)

虚幻四自带的Cloth/Hair/Eye/ClearCoat等着色模型均使用了该CustomData,来储存切线或者其他参数。

二.虚幻中Shader.usf的内部关联

前面做了一些铺垫,虚幻的材质系统在内部是有很大关联的。鄙人将介绍几个常用的usf文件,理解文件结构,也为后面增加着色模型提供了一些理论基础。

首先打开引擎源目录,找到Engine/Shaders文件夹(建议备份一份)

(4.18左右的版本里面还分了Private/Public/StandaloneRenderer的文件夹)

里面有很多文件,选几个解析一下其作用与各种关联。

这里需要有一点点编程基础(#include什么的,#if什么的指令需要清楚)

下面正文

1.BRDF.usf(BRDF.ush)

里面储存了大部分常用的brdf函数(大雾:抄过的人都说好)

因为里面应有尽有,只有想不到的,没有找不到的,在写着色模型的时候也能很轻松地调用,因此不详细解说了。

(其中一个Diffuse的BRDF,很方便shader学习者借鉴,因为上面有论文出处)

2.BasePassPixelShader.usf

控制写入GBuffer的着色器。可以读取材质编辑器里输出的参数,可以控制GBuffer里应该写入什么。

比如材质编辑器里指定了着色模型A,这个Pass可以控制把材质中的diffusecolor写入到normal里,把specular写入到ao里,大概就是这个意思。也就是说,这里再次说明了材质只是中介的中介,不管材质的输出是怎么连的,最后决定怎么写入GBuffer的都是这个shader。

3.DeferredLightingCommon.usf(DeferredLightingCommon.ush)

这个文件顾名思义,就是控制光照的。其中最重要的函数是GetDynamicLighting,这里控制了对于每种光源/每种表面,着色器应该怎么处理。添加着色模型也应该从这里入手。

4.ShadingModels.usf(ShadingModels.ush)

被3. include了。主要函数是SurfaceShading 等一系列决定最终光照的函数。

里面根据GBuffer里储存的ShadingModel,在case SHADINGMODELID_XXXXXX 里进行了着色模型的选择。

同时,这个文件里是最终决定着色方式的著色器。

他们的执行顺序(按理来说)应该是:2->3->4->1

三.插入自定义着色模型

首先来一个简单的例子:

在ShadingModels.usf(ShadingModels.ush)中找到StandardShading函数,这个函数被SurfaceShading 当着色模型为默认时调用。

其中有三行:

float3 Diffuse = Diffuse_Lambert( DiffuseColor );

//float3 Diffuse = Diffuse_Burley( DiffuseColor, LobeRoughness[1], NoV, NoL, VoH );

//float3 Diffuse = Diffuse_OrenNayar( DiffuseColor, LobeRoughness[1], NoV, NoL, VoH );

可以通过注释更改默认的Diffuse的BRDF。

对于高光也可以进行一样的操作,当然前提是读者对shader十分熟悉了,自然替换起来也可以得心应手。

关于添加/插入自己的着色模型。

提供两种方案

1.通过C++增加材质编辑器里的着色模型选项,然后再通过shader增加真正的shadingmodel

2.直接去掉虚幻默认的shadingmodel,更改为自己的。

拿ClearCoat举例,在材质中选择ClearCoat可以开多三个口:

透明图层,透明图层粗糙度,还有最后的BottomNormal。

先从BasePassPixelShader.usf开始

找到#elif MATERIAL_SHADINGMODEL_CLEAR_COAT

然后就可以决定这些接口将怎么被写入GBuffer中。

GBuffer.CustomData.xy = ClearCoatBottomNormal0(MaterialParameters).xy;

GBuffer.CustomData.z = GetMaterialCustomData0(MaterialParameters);

GBuffer.CustomData.w = GetMaterialCustomData1(MaterialParameters);

就像这样,写入到Custom的xy就是BottomNormal的xy值,写入到Custom的z的就是材质输出的透明图层,以此类推。

然后到ShadingModels.usf(ShadingModels.ush) 中找到SurfaceShading ,可以看到类似的根据着色模型ID选择着色模型的代码。新建一个函数XX(FGBufferData GBuffer),

在case SHADINGMODELID_CLEAR_COAT:

后调用自己的函数。

XX(GBuffer);

然后就可以在这个函数里为所欲为了。

关于NPR的着色器可以参考底下:

这里我给出一个自己改进过的经验模型,也就是题图的着色模型的Diffuse部分:

(暂且命名为Diffuse_YCZ函数)

这个函数是基于CelShading的,加入了一个Hardness这个参数,来控制分界边的软硬。

注:Hardness需要为整数。这种办法可以使CelShading退化至普通的Lambert,对于边界的锯齿也能更好地去除。

(将GBuffer里除了法线之外的插槽全部改为了自定义的参数,如控制多颜色的Instance,控制阴影,等)

使用这种办法可以快速加入自己需要的着色模型,相当于定制自己的引擎,比修改源码重新编译应该要来得更靠谱一点,从成功几率上看。

本期文章要分享的东西也写完了~希望能帮到各位虚幻四的用户和读者。

下一期将会简单地介绍一下一些后期处理在虚幻四中的实现方法。

包括NPR的Hatching,描边,还有水面分界特效的简单实现方法。

(Hatching与描边)

(动态水面分界)

https://www.zhihu.com/video/913096339934576640

大家的点赞才是我最大的前进的动力~所以 阅读完之后记得点赞哦(๑•̀ω•́ ๑)

文章仅仅为了分享经验交流心得,抛砖引玉,见笑大方了。如有纰漏,望斧正。

参考文献/项目:

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

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

相关文章

可观测性PHP秩判据,线性系统的可控性与可观测性

现代控制理论中用状态方程和输出方程描述系统,输入和输出构成系统的外部变量,而状态为系统的内部变量,这就存在着系统内的所有状态是否可受输入影响和是否可由输出反映的问题,这就是可控性和可观测性问题。如果系统所有状态变量的…

ubuntu虚拟机进程被杀死_Ubuntu -- 查看和杀死进程

今天在netbeans中关闭webrick时,发现没有关闭掉,打入localhost:3000 依然显示页面,发现无法从nb中再次关闭只有进入ubuntu的进程下关闭查看进程:1, ps -e2, fengfeng:~$ sudo netstat -antupActive Internet connections (servers and established)Proto Recv-Q Send-Q Local…

matlab中的nlinfit,matlab中nlinfit问题!!!!!!!!!!!!

matlab中nlinfit问题!!!!!!!!!!!!mip版 关注:272 答案:3 悬赏:40解决时间 2021-01-19 04:20已解决2021-01-18 13:28muinline(beta(…

springboot幂等性_请问,springboot项目支付接口设计,如何保证支付的幂等性,并能给前端反馈友好的提示?...

什么是幂等性?幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。“ 在计算机中编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函…

php图片旋转显示不出来的,php – 我服务的图像不正确,它们都显示为旋转90度

在Exif中设置了方向.图片没有旋转phisicaly.图像查看器可以使用它,但标签中的浏览器不会旋转它.你也可以“飞行”旋转它.只需通过exif_read_data()获取Exif信息,如果在’Orientation’中有3(180deg),6(90CW)或8(-90CCW),则旋转它// dump the picture and stop the script$sourc…

bootstrap 滚动 进度条_bootstrap实现动态进度条效果

Bootstrap的动态进度条:html: 创建一个modal 这里使用fade先将modal隐藏起来,然后modal里面嵌入progress 代码很简单保存中:{{length}}%PS:关于模态框:如果你想实现点击空白处不关闭模态框,可以在这里初始化modal的参数&#xf…

电机控制系统php,电机控制系统的未来发展变化趋势

在智能化生产系统的发展过程之中,网络化分布式生产设备的实现意味着我国机器设备之间可以达到信息沟通的能力,而在这种沟通之中良好的控制系统则承担了枢纽的职责。在这种地机控制系统的发展之中迎合了我国智能联网时代的发展需求,将人机交互…

天宫初级认证答案_百度初级认证试题答案

仅供参考1. 推广商户想了解关键词在一地的推广情况,可使用:(单选题)估算工具 批量工具 推广实况工具 账户分析工具2. 在推广计划级别,可以进行以下哪些操作:(多选题)添加关键词 设置否定关键词 设置IP 排除 设置每日预算3. 关于账…

ci php做记录删除,CI(CodeIgniter)框架中的增删改查操作_PHP教程

CodeIgniter的数据函数类在 \system\database\DB_active_rec.php代码如下:class ModelName extends CI_Model{function __construct(){parent::__construct();}}连接数据库:$this->load->database();代码如下:classModel_name extends CI_Model{function __co…

python list 底层实现的数据结构_Python数据结构大起底——list篇

python内置的多种数据结构为编程提供了相当的便利,灵活的使用python中的内置数据类型可以达到事半功倍的效果,本文是对Python一些常用数据类型的整理,并列举出来了一些使用技巧。使用最多的数据结构 listlist内置了许多方法,常用的…

微信wechat.class.php,laravel使用组件实现微信网页授权登入

laravel框架中的实现简单实现微信网页授权登入首先引入基于laravel的easywechat的组件,laravel版本5.8$ cd laravel$ composer require "overtrue/laravel-wechat:~5.0"然后呢因为下载过程会比较缓慢所以可以先根据官方提供的方式配置一下该组件的中间件根据官方提供…

linux 扩展挂载盘大小_Linux 添加挂载硬盘(包含挂载大于2T以上硬盘)

转自:http://blog.csdn.net/season_hangzhou/article/details/36423223由于事先规划问题或者业务需求量激增,总会出现机器硬盘空间不够用的情况所以常常需要新增硬盘,操作方法如下一、安装硬盘到物理机上。二、查看硬盘是否正确安装。使用“f…

oracle 存储过程打印语句,oracle学习之第一个存储过程:打印Hello World

--第一个存储过程:打印Hello World/*调用存储过程2种方式:1、exec sayhelloworld();2、beginsayhelloworld();sayhelloworld();end;/*/create or replace procedure sayhelloworld --假设这个存储过程存在就replace替换否则create创建,这里创…

oracle 运维入门,Oracle日常基本运维命令及基本体系结构

Oracle日常基本运维命令及基本体系结构发布人:中嘉和信发布时间:2020.05.11来源:运维派中嘉和信北京机房以康盛机房、亦庄国际机房、四季青机房为主,作为互联网数据中心集成服务领域的标杆企业,中嘉和信一直以客户需求…

qc成果报告范例_质量引领创新 扬子江勇夺医药行业QC“十五连冠”

近日,第40届全国医药行业QC小组成果发布交流会圆满落幕,扬子江药业集团勇夺QC一等奖总数“十五连冠”。会上,业界人士共享新成果、带来新思考、集聚新视野。扬子江人凭借高标准、高要求的精益求精的创新精神,在产品质量、技术、人…

php关联图片,PHP关联链接添加方法

PHP关联链接添加方法为了优化内链,我们需要将内容添加上关键链接,那内容如果添加关联链接呢,怎么添加呢?下面小编带大家一起来看看详细内容,希望对大家有所帮助!方法一:手动编辑添加方法二:使用程序在输出…

mysql数据表中取几列_MySQL实现表中取出随机数据

MySQL是开放源代码,MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。 那么如何在MySQL实现表中取出随机数据呢?SELECT * FROM table_name ORDER BY rand() LIMIT 5;rand在…

获取php.ini配置信息,获得php所对应的配置文件(php.ini)信息

获得php所对应的配置文件(php.ini)信息[rootBIND9-master /usr/local/bin]# php --iniConfiguration File (php.ini) Path: /usr/local/etcLoaded Configuration File: /usr/local/Zend/etc/php.iniScan for additional .ini files in: /usr/local/etc/phpAdditional .…

android shpe 三角形_绘制三角形背景的android

I need to draw a background of layout as a triangle, like you can see in the picture.Ive found an example where they do something similar, but I dont know how to adapt it to my case. Here is the exampleCan anyone help me? Best.解决方案Here is an example o…

oracle 11g安装时设密码 database control,安装oracle 11g 保护Database Control时出错,Database Control已在非安全模式下启动...

错误解决:打开cmdC:\Users\lin>emctl status dbconsoleEnvironment variable ORACLE_UNQNAME not defined. Please set ORACLE_UNQNAME to database unique name.C:\Users\lin>C:\Users\lin>set oracle_sidorclC:\Users\lin>emca -config dbcontrol dbE…