虚幻4渲染编程(材质编辑器篇)【第十一卷: 自定义材质节点】

本文介绍了如何在虚幻4中扩展材质编辑器,通过创建自定义材质节点来实现与引擎底层的强耦合。讲解了材质节点的本质是包含HLSL代码的容器,并展示了从连接材质节点到生成最终着色器的流程。文中还提供了自定义材质节点的代码示例,包括.h和.cpp文件,以及实现多接口切换的功能。
摘要由CSDN通过智能技术生成

MY BLOG DIRECTORY:

YivanLee:专题概述及目录

INTRODUCTION:

大部分情况下我们可以使用CustomNode或者Material Function完成对材质节点的封装,方便开发各种上层功能,但是有时候我们需要让材质编辑器和引擎底层强耦合的时候或者开发了什么新的材质编辑器功能的时候,我们就需要开发拓展材质编辑器的节点了。


MAIN CONTENT:

最直观的,打开虚幻编辑器,我们随便连一个vector3到basecolor上,点编译按钮,我们就得到了一个材质。但是千万不要以为我们眼前看到东西就是shader。从本质上来说,我们眼前的材质节点只是包含一串HLSL代码的容器。

你可以打开引擎代码,找到如下目录(Source/Runtime/Engine/Classes/Material)就能看到引擎里所有材质节点的代码。找到HLSLMaterialTranslator,就会发现,这些节点里面保存的FString,里面加的就是HLSL代码。当我们在材质编辑器里面把线练好后,点下编译,材质节点就会依次执行,把里面的HLSl代码字符串抽出来,加到ShaderMap里,最后就得到了所谓的shader(简单粗暴)。下面就是Floor的HLSLTranslator里面的翻译代码,把节点翻译成HLSL代码

        virtual int32 Floor(int32 X) override
	{
		if(X == INDEX_NONE)
		{
			return INDEX_NONE;
		}
 
		if(GetParameterUniformExpression(X))
		{
			return AddUniformExpression(new FMaterialUniformExpressionFloor(GetParameterUniformExpression(X)),GetParameterType(X),TEXT("floor(%s)"),*GetParameterCode(X));
		}
		else
		{
			return AddCodeChunk(GetParameterType(X),TEXT("floor(%s)"),*GetParameterCode(X));
		}
	}
      

整理一下执行顺序。首先我们在编辑器连好材质,这些材质节点都会有调用HLSLTranslator的与这个材质节点相称的HLSLTranslator的代码,比如floor节点就会调用HLSLTranslator里的“virtual int32 Floor(int32 X)”这个函数。HLSLTranslator再把这个函数里的HLSL代码字符串加到Shadermap里(加进去还有其他函数调用,并不是HLSLTRaslator直接做的这个操作,不过它是这个操作的发起者。)完成了shadermap的事情之后就是交给引擎的其他类去编译顶点着色器啦,像素着色器啦。。。后面的过程不作讨论了。大概的过程就是这样。

下面我就实现了一个自己的材质节点。首先创建一个MyMaterialExpression类,派生自UMaterialExpression。

下面是.h文件</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值