因为目前打交道的项目使用的大多是UE引擎,因此经常会有一些与UE相关的知识需要做一些总结与回顾,方便后续遇到能快速回想起来,特此开了这个专辑,而本文是这个专辑中的第一篇,主要介绍UE中材质蓝图中输出节点上的相关属性,由于属性数目实在太多,因此很难也没有必要完全覆盖,这里只对其中一些比较晦涩难懂的部分做介绍。
材质属性界面1. Material面板
这个面板用于控制材质的渲染方式,包括Material Domain,Blend Mode等多个属性。
1.1 Blend Mode
Blend Mode是用于控制材质混合方式的一项属性,包括如下的一些选项:
Blend Mode这些选项的含义在Material Blend Modes页面上可以找到定性的描述,但是这种介绍对于一个开发同学来说多多少少有些雾里看花的意味,因此迫切想要搞清楚这些Blend Mode的具体实现算法。
经过一番搜索,我们在MobileBasePassPixelShader.usf与BasePassPixelShader.usf两个文件中找到了相关的处理逻辑,前者为移动端渲染实现,后者为PC延迟管线渲染实现,出于实用性考虑,我们这里以移动端渲染为例进行介绍。
所有的Blend Mode是通过宏进行控制的,宏的前缀为MATERIALBLENDING_,比如Masked对应的宏为MATERIALBLENDING_MASKED。
不同的Blend Mode在渲染时候的计算逻辑主要包含在函数FrameBufferBlendOp中:
half3 FrameBufferBlendOp(half4 Source)
{
half4 Dest = FragColor;
#if MATERIALBLENDING_SOLID
return Source.rgb;
#elif MATERIALBLENDING_MASKED
return Source.rgb;
// AlphaComposite will set both MATERIALBLENDING_TRANSLUCENT and MATERIALBLENDING_ALPHACOMPOSITE defines
// so ensure MATERIALBLENDING_ALPHACOMPOSITE gets first in line
#elif MATERIALBLENDING_ALPHACOMPOSITE
return Source.rgb + (Dest.rgb*(1.0 - Source.a));
// AlphaHoldout will set both MATERIALBLENDING_TRANSLUCENT and MATERIALBLENDING_ALPHAHOLDOUT defines
// so ensure MATERIALBLENDING_ALPHAHOLDOUT gets first in line
#elif MATERIALBLENDING_ALPHAHOLDOUT
return (Dest.rgb*(1.0 - Source.a));
#elif MATERIALBLENDING_TRANSLUCENT
return (Source.rgb*Source.a) + (Dest.rgb*(1.0 - Source.a));
#elif MATERIALBLENDING_ADDITIVE
return Source.rgb + Dest.rgb;
#elif MATERIALBLENDING_MODULATE
return Source.rgb * Dest.rgb;
#endif
}
MATERIALBLENDING_SOLID对应的是Opaque Mode,输出结果就是当前材质在当前像素上的输出color;
MATERIALBLENDING_MASKED输出的也是当前材质在当前像素上输出的Color,不过不同的是对于这种mode,后面会根据Mask的数值判断是否需要调用clip指令,所以这种模式其实对应的就是我们常说的AlphaTest材质;
至于其他的Blend Mode的实现在上面的函数中已经表述得非常清楚了,因此这里就不再赘述了。
——————————
未完待续...
网友评论