Files
BlueRoseNote/03-UnrealEngine/卡通渲染相关资料/渲染功能/ARC/Rendering/自定义材质属性.md

106 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 支持 |