UE 【材质编辑】自定义ShadingMode

【UE 4.27.2】

在UE中提供了多种多样的ShadingMode,相当于一种风格化的处理方案(整体全面的流程调整),切换ShadingMode可以看到不同的显示效果:

通过简单的拓展,我们可以实现自定义的ShadingMode,使得我们切换到自己的ShadingMode时可以直接应用上我们自己的一套风格化效果(极大的提高材质编辑效率)。

1.编辑器添加ShadingMode选项

材质编辑面板

为了能让自定义的ShadingMode显示在材质编辑面板,首先找到EMaterialShadingModel这个枚举(EngingTypes.h),在其中键入我们自定义ShadingModel的枚举值:

【EngingTypes.h定义了大量的系统枚举值,都值得好好的研究使用】

有了此枚举值,编译代码时,会自动在EngineTypes.generateed.h生成对应的字段

我们还可以为我们自定义的ShadingMode启用材质面板上可以连接的Pin接口:在Material.cpp的IsPropertyActive_Internal,使得我们使用自定义ShadingMode时,启用CustomData0这个Pin

并且还可以在MaterialShader.cpp :: FMaterialAttributeDefinitionMap::GetAttributeOverrideForMaterial中定制,在我们这个ShadingModel下,Pin接口显示的名字:

控制Shader逻辑

以上我们完成了对材质编辑面板的显示改造,但Shader还并不受控制。对于Shader的控制,则通过宏来实现:在FHLSLMaterialTranslator::GetMaterialEnvironment中根据ShadingModel向Shader中压入一条宏”MATERIAL_SHADINGMODEL_MY_CUSTOM_MODE“

那么在Shader中就可以根据这个宏来决定执行流程。

2.Shader中执行

根据压入的宏,我们定义自己的一套算法:

在ShadingModelsMaterial.ush::setGBufferForShadingModel中:

在GBuffer中存入我们算法所需的数据。

要完成这一步,还需要如下两步:

定义Shader中的ShadingModel

如上图:GBuffer.ShadingModelID = SHADINGMODELIG_MY_CUSTOM_MODEL;

SHADINGMODELIG_MY_CUSTOM_MODEL从何而来?预定义

要注意不仅要自定义这个宏,还要把NUM在原有基础上+1;

允许往GBuffer写数据

部分Shader需要往customData通道写数据,多个条件使用||连接(注意换行带Tab可能编译出错)

完成了上述两步,我们的数据就能写入到GBuffer里边了。

应用GBuffer中数据实现自定义逻辑

根据我们传递到GBuffer中的数据,我们可以组织实现自己的算法逻辑:

一个很简单的实现:直接控制着色表现,将该ShadingModel模式下的着色完全改变为某个纯色

编译,查看此时的效果:

当我们不往CustomDta接口上连节点:

因为GBuffer.CustomData.x==0,则return float4(0.0,1.0,0.0,1.0);

当我们连接一个固定值“1”:

奇怪的是结果并没有改变,此时,尝试对比SHADINGMODELID_EYE,发现Shader中有这么一个可以的函数:

继续查看其使用:仅对特殊的ShadingModel才支持GBufferD的数据,否则就是0

于是我们在HasCustonGBufferData中拓展:

当我们将时间值接入做成动画:

3.添加ShadingModel的显示色

当作一个debug工具来用吧,看到这个颜色表示我们的ShadingModel应用是成功的。

在ShadingsCommon.ush::GetShadingModelColor中,指定对应ShadingModel的演示色:

那么在编辑器中,做如下切换时,就能看到对应的颜色:

4.卡通效果ShadingModel

接着上述成果,已经可以做到控制输出结果。那么要实现卡通效果,则是对光照计算过程的修正,即替换这里的计算逻辑。

向下:

深入GetDynamicLightingSplit:

里边会调用IntegrateBxDF,进入发现:这里根据不同的ShadingModel选择了不同的反射方案

为此,我们定义卡通效果的BxDF:

FDirectLighting CartoonCustomBxDF( FGBufferData GBuffer, half3 N, half3 V, half3 L, float Falloff, float NoL, FAreaLight AreaLight, FShadowTerms Shadow )
{
#if GBUFFER_HAS_TANGENThalf3 X = GBuffer.WorldTangent;half3 Y = normalize(cross(N, X));
#elsehalf3 X = 0;half3 Y = 0;
#endifBxDFContext Context;Init( Context, N, X, Y, V, L );SphereMaxNoH( Context, AreaLight.SphereSinAlpha, true );Context.NoV = saturate( abs( Context.NoV ) + 1e-5 );FDirectLighting Lighting;//====================================//自定义diffuse实现float customValue=GBuffer.CustomData.x*0.5f;float diffValue=smoothstep(0.5f-customValue,0.5f+customValue,Falloff*NoL);Lighting.Diffuse=AreaLight.FalloffColor*diffValue*Diffuse_Lambert(GBuffer.DiffuseColor);//====================================if( AreaLight.bIsRect )Lighting.Specular = RectGGXApproxLTC( GBuffer.Roughness, GBuffer.SpecularColor, N, V, AreaLight.Rect, AreaLight.Texture );elseLighting.Specular = AreaLight.FalloffColor * (Falloff * NoL) * SpecularGGX( GBuffer.Roughness, GBuffer.Anisotropy, GBuffer.SpecularColor, Context, NoL, AreaLight );Lighting.Transmission = 0;return Lighting;
}

向上:

已经定义好卡通效果的BxDF,那么什么地方调用?即GetDynamicLighting在哪里调用:

通过全局搜索,可知:

分析这个结果,主要是两个函数:

再对这两个函数的调用进行查看:

于是补充GET_LIGHT_GRID_LOCAL_LIGHTING_SINGLE_SM部分

另一处与之类似,也做对应补充。

【最终效果看上去有点问题】

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

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

相关文章

DevOps学习笔记

记录以下DevOps学习笔记,这里是笔记的入口汇总,可以直观的看到所有的笔记,还没有入口的部分,在下正在努力编写中。 gitlab jenkins docker docker安装 artifactory 1.artifactory安装 2.artifactory使用 计算机网络 1.dn…

MySQL:约束

目录 一、概述二、创建测试三、外键约束3.1 数据准备3.2 添加外键3.3 删除外键3.4 增加外键约束 一、概述 约束主要用于作用在表中字段上的规则,用于限制存储在表中的数据。 保证数据库中数据的正确性、有效性和完整性。 约束描述关键字主键约束非空并且唯一PRIMARY…

【Vue】Echart渲染数据时页面不显示内容

背景 做的一个对话交互的功能,根据后台返回的数据,渲染成Echart图表展示因为图表种类多,因此根据不同图表单独做了一个个vue组件,将数据根据展示类型传到这些子组件中进行渲染无论哪种图表,第一次展示时都能正常展示&…

【Threejs学习】材质灯光投影

一、光源分类 环境光(AmbientLight):会均匀的照亮场景中的所有物体。无方向,不能投射阴影。平行光(DirectionalLight):沿特定方向散发的光,发出的光线都是平行的。例如太阳光,可投射阴影。点光源(PointLight)&#xf…

基础闯关5

一、XTuner简介 XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。 高效 支持大语言模型 LLM、多模态图文模型 VLM 的预训练及轻量级微调。XTuner 支持在 8GB 显存下微调 7B 模型,同时也支持多节点跨设备微调更大尺度模型(70B)。自…

足球大小球预测及足球大数据之机器学习预测大小球

足球运动是当今世界上开展最广、影响最大、最具魅力、拥有球迷数最多的体育项目之一,尤其是欧洲足球,每年赛事除了五大联赛(英超、西甲、德甲、法甲、意甲)之外,还会有欧冠(欧洲冠军联赛)&#…

chapter10-OOP高级部分——(静态内部类)——day14

422-静态内部类1 423-静态内部类2 424-内部类测试 输出两个5 我亦无他,唯手熟尔

mfc140u.dll丢失的解决方法都有哪些?有效的将丢失的mfc140u.dll恢复

在使用基于Windows系统的电脑运行某些应用程序时,可能会遇到一个提示错误:“mfc140u.dll文件丢失”。这通常意味着你的系统缺少某个必要的动态链接库(DLL)文件,这可能会阻止程序正常运行。本文将向你介绍一系列有效的解…

腾讯云Linux服务器运维,安装JDK、rabbitmq、nginx、Redis、ClickHouse

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 CODING 代码托管目录 1、…

elasticsearch的docker方式安装及golang1.22版本使用elasticsearch7的示例代码

1.准备linux服务器,ip地址为192.168.137.116 2.安装docker-ce yum -y install docker-ce 配置docker镜像 vim /etc/docker/daemon.json{"registry-mirrors": ["https://harbor:443", "https://985ecq8w.mirror.aliyuncs.com","https://…

c# checkbox的text文字放到右边

checkbox的text文字放到右边 实现方法如下图 特此记录 anlog 2024年9月2日

RKNPU2从入门到实践 ---- 【8】借助 RKNN Toolkit lite2 在RK3588开发板上部署RKNN模型

前言 作者使用的平台为Ubuntu20.04虚拟系统,开发板为瑞芯微RK3588,开发板上的系统为Ubuntu22.04系统。 一、任务 完成RKNN模型的部署,RKNN模型的部署是将RKNN模型放到开发板上,应用程序可以加载RKNN模型,从而在嵌入式…

《JavaEE进阶》----5.<SpringMVC②剩余基本操作(CookieSessionHeader响应)>

Cookie和Session简介。 Spring MVC的 2.请求 Cookie的设置和两种获取方式 Session的设置和三种获取方式。 3.响应 1.返回静态页面 2.返回数据 3.返回HTML片段 4.返回JSON 5.设置状态码 6.设置header 三、(接上文)SpringMVC剩余基本操作 3.2postman请求 …

两大电商巨头强强联手,实力宠卖家,一键通9国市场!

独家深度剖析,Lazada与Daraz分别作为东南亚与南亚电商领域的璀璨明星,正携手演绎一场前所未有的商业盛宴。这两大电商巨擘的强强联合,不仅标志着电商版图的一次重大扩张,更是为全球商家开启了一扇通往东南亚与南亚九大市场广阔蓝海…

Uniapp 调用aar、jar包

废话 坑是真的多,官方文档简陋到可以忽略不计。 大概流程 1. 新建一个Android模块,需要用这个模块打包成aar 2. 用这个模块引用uniapp-v8-release.aar以及你需要用到的aar、jar,用不到则忽略这步 坑一:不要直接放到这个模块的…

详解JavaScript

目录 JavaScript 引入样式 基础语法 变量 数据类型 运算符 JavaScript对象 数组 数组定义 数组操作 函数 语法格式 关于参数个数 函数表达式 对象 JQuery 语法 选择器 事件 常见的事件 操作元素 获取/设置元素内容 获取/设置元素属性 获取/设置CSS属性 …

StringTable

10.1. String的基本特性 String:字符串,使用一对""引起来表示String声明为final的,不可被继承String实现了Serializable接口:表示字符串是支持序列化的。String实现了Comparable接口:表示string可以比较大小…

JMeter 工具安装以及简单使用

一、安装以及汉化 傻瓜式JMeter下载和环境配置及永久汉化-CSDN博客https://blog.csdn.net/weixin_45608163/article/details/136528719 二、发送GET请求 配置请求头: 配置该线程组的请求: 放在线程组统计,下面请求则共享配置

[图解]SysML和EA建模住宅安全系统-活动作为块

1 00:00:00,210 --> 00:00:04,360 下一个步骤是识别潜在的失效 2 00:00:06,850 --> 00:00:11,150 这里它是用一个块定义图来表达的 3 00:00:12,150 --> 00:00:16,790 图17.21,失效模式识别和因果依赖 4 00:00:19,110 --> 00:00:22,400 但是这个块定义…

Java基于微信小程序的美食推荐小程序,附源码

博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不…