vault backup: 2026-05-03 20:37:58

This commit is contained in:
2026-05-03 20:37:58 +08:00
parent 4fb34c6f38
commit 83502d0874
37 changed files with 2411 additions and 0 deletions

View File

@@ -0,0 +1,105 @@
---
title: 自定义材质属性
date: 2026-05-03 00:00:00
excerpt: 新增 MaterialProperty、BlendMode 和材质标记
tags:
- ARC
- Rendering
- Material
rating: ⭐
---
# 自定义材质属性
返回 [[Rendering]]
## 概述
ARC 引擎在 UE4 材质系统中新增了多个材质属性MaterialProperty、混合模式BlendMode和材质标记为卡通渲染的顶点变换和特殊效果提供材质图级别的控制能力。
## 新增材质属性
| 属性 | 枚举值 | 类型 | 用途 |
|------|--------|------|------|
| `MP_OrthoBlendWeight` | float | 顶点 | [[正交投影混合]]权重0=透视1=正交 |
| `MP_ScreenAlignedMeshOffset` | float3 | 顶点 | [[屏幕对齐网格]]偏移(像素单位) |
| `MP_ScreenAlignedMeshScale` | float3 | 顶点 | [[屏幕对齐网格]]缩放 |
| `MP_ScreenSpaceDepthOffset` | float | 顶点 | [[屏幕空间深度偏移]]值 |
| `MP_LocalPositionScale` | float3 | 顶点 | [[局部位置缩放]]系数 |
### Shader 端访问函数
`MaterialTemplate.ush` 中生成对应的访问函数:
```hlsl
float GetMaterialOrthoBlendWeight(FMaterialVertexParameters Parameters) { %s; }
float3 GetMaterialScreenAlignedMeshOffset(FMaterialVertexParameters Parameters) { %s; }
float3 GetMaterialScreenAlignedMeshScale(FMaterialVertexParameters Parameters) { %s; }
float GetMaterialScreenSpaceDepthOffset(FMaterialVertexParameters Parameters) { %s; }
float3 GetMaterialLocalPositionScale(FMaterialVertexParameters Parameters) { %s; }
```
`%s``HLSLMaterialTranslator` 在编译时替换为材质图表达式。
## 新增混合模式
| 混合模式 | 枚举值 | 混合公式 | 用途 |
|---------|--------|---------|------|
| `BLEND_X2Multiply` | — | `DestColor × SourceColor × 2` | 双倍乘法混合,用于深色叠加 |
| `BLEND_AdditiveForUI` | — | `Dest + Source × SourceAlpha` | UI 专用加法混合 |
### X2Multiply 雾效处理
`BasePassPixelShader.usf` 中为 X2Multiply 提供自定义雾效混合:
```hlsl
#elif MATERIALBLENDING_X2MULTIPLY
half3 FoggedColor = lerp(
float3(0.5, 0.5, 0.5), // 中灰(乘法中性色)
Color,
Fogging.aaa * Fogging.aaa);
Out.MRT[0] = half4(FoggedColor, Opacity);
```
## 新增材质标记
| 标记 | 类型 | 说明 |
|------|------|------|
| `bScreenAlignedMesh` | bool | 启用[[屏幕对齐网格]]渲染模式 |
| `bForcedPrepass` | bool | 强制该材质走 Early-Z PrePassASW/Wizcorp |
### bForcedPrepass
`BasePassRendering.cpp` 中控制深度绘制行为:
```cpp
// 强制 PrePass 的材质始终写入深度
if (Material.bForcedPrepass)
{
// 走 DepthPass 而非依赖 BasePass 深度写入
}
```
可在材质实例中覆盖(`MaterialEditor` 中显示为可覆盖属性)。
## REDMaterialInstanceDynamic
新增 `REDMaterialInstanceDynamic` 类(`REDMaterialInstanceDynamic.h/.cpp`),扩展了标准 `UMaterialInstanceDynamic`,可能用于运行时的卡通渲染材质参数控制。
## 关联文档
- [[正交投影混合]] — 使用 `MP_OrthoBlendWeight`
- [[屏幕对齐网格]] — 使用 `MP_ScreenAlignedMeshOffset/Scale`
- [[BasePass修改]] — `bForcedPrepass` 的影响
## 修改文件列表
| 文件 | 修改类型 |
|------|---------|
| `Source/Runtime/Engine/Public/SceneTypes.h` | 新增 `MP_*` 枚举 |
| `Source/Runtime/Engine/Classes/Materials/Material.h` | 新增 `bScreenAlignedMesh``bForcedPrepass` |
| `Source/Runtime/Engine/Classes/Materials/REDMaterialInstanceDynamic.h` | **新增** |
| `Source/Runtime/Engine/Private/Materials/REDMaterialInstanceDynamic.cpp` | **新增** |
| `Source/Runtime/Engine/Private/Materials/HLSLMaterialTranslator.cpp` | 编译支持 |
| `Shaders/Private/MaterialTemplate.ush` | 新增访问函数 |
| `Source/Editor/MaterialEditor/` | 编辑器 UI 支持 |