FLAXengine代码剖析

2021SC@SDUSC

VisualScriptExecutor::VisualScriptExecutor()
{
_perGroupProcessCall[6] = (ProcessBoxHandler)&VisualScriptExecutor::ProcessGroupParameters;
_perGroupProcessCall[7] = (ProcessBoxHandler)&VisualScriptExecutor::ProcessGroupTools;
_perGroupProcessCall[16] = (ProcessBoxHandler)&VisualScriptExecutor::ProcessGroupFunction;
_perGroupProcessCall[17] = (ProcessBoxHandler)&VisualScriptExecutor::ProcessGroupFlow;
}

void VisualScriptExecutor::Invoke(const Guid& scriptId, int32 nodeId, int32 boxId, const Guid& instanceId, Variant& result) const
{
auto script = Content::Load(scriptId);
if (!script)
return;
const auto node = script->Graph.GetNode(nodeId);
if (!node)
return;
const auto box = node->GetBox(boxId);
if (!box)
return;
auto instance = Scripting::FindObject(instanceId);

// Add to the calling stack
VisualScripting::ScopeContext scope;
auto& stack = ThreadStacks.Get();
VisualScripting::StackFrame frame;
frame.Script = script;
frame.Node = node;
frame.Box = box;
frame.Instance = instance;
frame.PreviousFrame = stack.Stack;
frame.Scope = &scope;
stack.Stack = &frame;
stack.StackFramesCount++;

// Call per group custom processing event
const auto func = VisualScriptingExecutor._perGroupProcessCall[node->GroupID];
(VisualScriptingExecutor.*func)(box, node, result);

// Remove from the calling stack
stack.StackFramesCount--;
stack.Stack = frame.PreviousFrame;

}

然后看下一个类。

Class AnimationGraphFunction.

动画图形函数资产,包含动画图形的可重用部分。

Methods:
GetSignature(out String[], out String[])
获取 Visject Surface 编辑器的函数签名。

LoadSurface()
尝试从资产加载曲面图。

SaveSurface(Byte[])
更新图表面(保存新图表,放弃缓存的数据,重新加载)。

Class CubeTexture

立方体纹理,包含6个图像,作为一个立方体映射(每个轴方向一个图像)。

CubeTexture::CubeTexture(const SpawnParams& params, const AssetInfo* info)
TextureBase(params, info)
{
}

可以看到相当于就是保存了纹理材质。

Class IESProfile

包含 IES 配置文件纹理使用的光线,以模拟现实的灯泡发光。

Properties:
Brightness
灯光亮度,从 IES 配置文件导入。类型是Single

TextureMultiplier
将纹理值映射为结果的乘数
不是很好理解,应该涉及到了光线相关的专业知识。single类型

IESProfile::IESProfile(const SpawnParams& params, const AssetInfo* info)
TextureBase(params, info)
, Brightness(0)
, TextureMultiplier(1)
{
}

可以看到默认亮度为0,而纹理乘数因子为1

Class MaterialBase

一开始还以为这个是什么基础材料类,结果是Material和materialnstance的基类。

Properties:
Info
获取描述材料表面的材料信息、结构。类型是MaterialInfo。

结构体:Struct MaterialInfo

具有材料表面基本信息的结构。它描述了材料是如何对光做出反应的,以及需要渲染哪些图形特征。

Fields:
BlendMode
渲染的混合模式。类型是MaterialBlendMode

枚举类型 Enum MaterialBlendMode

材质混合模式。
Fields:
Additive
添加混合。材质的颜色添加进物体表面之后的颜色。在前传渲染中使用。
Multiply
多重混合。材质的颜色用来增加物体表面后面的颜色。在正向传递渲染中使用。
Opaque
不透明材质。
Transparent
透明材质。在前传渲染中使用。

CullMode
基元剔除模式。类型是CullMode

枚举类型Enum CullMode

Fields
Inverted
仅剔除面向前方的原始数据。
Normal
仅剔除面向后方的原始数据。
TwoSided
不进行剔除原始数据。
DecalBlendingMode
贴花材料混合方式。类型是MaterialDecalBlendingMode

枚举类型 Enum MaterialDecalBlendingMode

Fields
Emissive
贴花将只适用于散射光。
Normal
贴花将只混合法向量。
Stain
贴花颜色将与材料表面颜色混合(使用乘法)。
Translucent
贴花将与材料表面充分混合。

Domain
材质着色域。类型是MaterialDomain

枚举类型MaterailDomain

材质域类型。材质域定义材质着色器的目标用法。
Fields

Decal
贴花材料。可以用来应用自定义覆盖或表面修改的对象表面。
Deformable
可变形着色器。只能用于可变形的物体(样条模型)。
GUI
GUI 着色器。可用于绘制自定义控件界面元素或向 GUI 添加自定义效果。
Particle
粒子着色器。只能用于粒子的几何形状(精灵,轨迹和条带)。支持在 GPU 上读取粒子数据。
PostProcess
后期处理材料。可用于对渲染的帧进行自定义后期处理。
Surface
表面材质。可以用来渲染场景的几何形状,包括模型和蒙皮模型。
Terrain
地形着色器。只能用于使用优化顶点数据和支持多层混合的景观块几何体。
VolumeParticle
粒子着色器用于渲染体积效果,如体积雾。

FeaturesFlags
功能使用的标志

枚举类型:Enum MaterialFeaturesFlags

Fields
DisableDepthTest
禁用深度测试(材料忽略深度)。
DisableDepthWrite
禁用深度缓冲写(不会在渲染期间修改深度缓冲值)。
DisableDistortion
该标志用于禁用失真效果(光折射)。前进通过材料选项。
DisableFog
用于禁用雾的标志。前进通道材质选项。
DisableReflections
用于禁用反射的标志。前进传递材质选项。
DitheredLODTransition
用于指示材料使用抖动模型 LOD 转换以实现更平滑的 LOD 转换的标志。
InputWorldSpaceNormal
用于表示材质输入法向量是在世界空间而不是切线空间中定义的标志。
None
没有标志。
PixelNormalOffsetRefraction
用于根据每像素法线和每顶点法线之间的差来允许折射偏移的标志。适用于大型类水表面。
Wireframe
线框材料。

MaskThreshold Mask threshold
掩模阈值。 类型是Single

MaxTessellationFactor Maxtesellationfactor
最大镶嵌因子(仅当材料使用镶嵌时使用)。类型是Int32.

OpacityThreshold 不透明阈值
类型也是Single

PostFxLocation
后 fx 材质渲染位置。类型是MaterialPostFxLocation

枚举类:Enum MaterialPostFxLocation

Fields

AfterAntiAliasingPass
AA过滤器通过。渲染完成输出回缓冲区。
AfterCustomPostEffects
后自定义后效果。
AfterPostProcessingPass
后处理通过使用 LDR 输入帧。
BeforeForwardPass
前后传递的 GBuffer 带有 HDR 输入帧。
BeforePostProcessingPass
前后处理通道使用 HDR 输入帧。
BeforeReflectionsPass
用于实现自定义光类型,将照明累积到光缓冲区。
MAX
枚举中的项数。

ShadingModel
照明的阴影Model。类型是MaterialShadingModel

枚举类MaterialShadingModel

材质着色模式。定义材质输入和属性如何组合以产生最终的表面颜色。
Fields
Foliage
植物材料。适用于叶子和草等需要光散射的植物材料,通过这个薄薄的物体传输模拟信息。
Lit
默认材料。材料表面最常见的选择。
Subsurface
地下材料,用于像 vax 或者皮肤这样需要光散射通过物体传输模拟信息的材料。
Unlit
没有照明的材料。发射通道用作输出颜色。可以执行自定义照明操作或仅仅发光。不会受照明管线影响。

TessellationModel
镶嵌模式。类型是TessellationMethod

枚举类型 TessellationMethod

描述图形系统支持的不同镶嵌方法。

Fields
Flat
扁平镶嵌。也称为切割镶嵌。
None
没有镶嵌。
Phong
Phong 法线插值的几何版本,不应用于法线,而是顶点位置。
PointNormal
点法线镶嵌。

UsageFlags
使用标记。类型是MaterialUsageFlags

枚举类型:MaterialUsageFlags

材质特征使用标志,由材质生成器检测到,帮助绘图管线优化材质着色器的渲染。

Fields
None
没有旗帜。
UseDisplacement
该材料是使用位置置换(在域着色器)。
UseEmissive
这种材料使用的是发射光。
UseMask
材质使用掩模丢弃一些像素。蒙面材质在阴影贴图和深度通道渲染中使用全顶点缓冲区(需要 uv)。
UseNormal
材质是使用每像素法线贴图。
UsePositionOffset
材料是使用世界位置偏移(它可能是动画内着色器)。
UseRefraction
用来表示材料使用折射特征的标志。
UseVertexColor
材质使用顶点颜色。渲染将尝试为管道提供一个适当的缓冲区,以便材质可以收集有效的数据。

Methods:
CreateDefault()
创建默认的 MaterialInfo。返回一个默认的result,类型就是自己,也就是MaterialInfo

Equals(MaterialInfo)
与其他材质信息进行比较,如果两个值相等,则返回 true。

然后下面是重载了几个比较和相等运算。

重载了运算符,相等和不相等。

上面我们看的是MaterialInfo,别搞晕了。

回到材料的基类。

IsDecal
获取一个值,该值指示此材质是否为贴花(不能与普通网格一起使用)。类型是布尔值。

IsGUI
获取一个值,该值指示此材质是否为 GUI 着色器(不能与普通网格一起使用)。布尔类型

IsParticle
获取一个值,该值指示此材质是否为粒子着色器(不能与普通网格一起使用)。布尔。

IsPostFx
获取一个值,该值指示此材质是否为 post fx (不能与普通网格一起使用)。布尔。

IsSurface
获取一个值,该值指示此材质是否为表面着色器(可以与普通网格一起使用)。

IsTerrain
获取一个值,该值指示此材质是否为地形着色器(不能与普通网格一起使用)。

Parameters
获取材料参数的集合。类型是一个MaterialParameter的数组。

类Class MaterialParameter
材质变量对象。允许在运行时修改材质参数值。

Properties
IsOverride
返回布尔值,指示是否被覆盖。

IsPublic
返回布尔值,指示是否公共可见。

Name
参数名。字符串。

ParameterID
参数ID,System.Guid类型。

ParameterType
获取参数类型。MaterialParameterType类型。

枚举类:Enum MaterialParameterType

Fields
Bool
布尔值
ChannelMask
RGBA 通道选择掩码。
Color
颜色。
CubeTexture
立方体纹理。
Float
浮点
GameplayGlobal
全局
GPUTexture
GPU 纹理(由代码创建)。
GPUTextureArrey
GPU 纹理数组(由代码创建)。
GPUTextureCube
GPU 立方体纹理(从代码创建)。
GPUTextureVolume
GPU 的卷纹理(从代码创建)。
Integer
整数
Invalid
无效类型
Matrix
矩阵
NormalMap
法线贴图纹理
SceneTexture
场景纹理
Texture
材质
TextureGroupSampler
纹理采样器
Vector2
矢量2
Vector3
矢量3
Vector4
矢量4

Value
获取或设置参数的值。类型是Object。

Methods
CreateVirtualInstance()
创建此材质的虚拟材质实例,允许覆盖任何材质参数。返回一个材料的实例。

GetParameter(String)
获取材料的参数。返回MaterialParameter。

GetParameterValue(String)
获取材质参数值。类型是Object。

SetParameterValue(String, Object, Boolean)
设置 material 参数值(并将 IsOverride 设置为 true)。

然后看一下这个材料基类对应。

Variant MaterialBase::GetParameterValue(const StringView& name)
{
const auto param = Params.Get(name);
if (param)
{
return param->GetValue();
}
LOG(Warning, “Missing material parameter ‘{0}’ in material {1}”, String(name), ToString());
return Variant::Null;
}

void MaterialBase::SetParameterValue(const StringView& name, const Variant& value, bool warnIfMissing)
{
const auto param = Params.Get(name);
if (param)
{
param->SetValue(value);
param->SetIsOverride(true);
}
else if (warnIfMissing)
{
LOG(Warning, “Missing material parameter ‘{0}’ in material {1}”, String(name), ToString());
}
}

MaterialInstance* MaterialBase::CreateVirtualInstance()
{
auto instance = Content::CreateVirtualAsset();
instance->SetBaseMaterial(this);
return instance;
}
直接拿到实例。

这样我们Assets大包里面的就差不多了。

回顾一下

Assets里面有哪些对象呢,比较重要的:
Animation 动画
AnimationGraph 动画图
Material 材料
Model 模型
Shader 阴影
SkeletonModel 骨架模型
SkinnedModel 蒙皮模型
Texture 材质
VisualScript 可视化脚本

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值