This commit is contained in:
2025-08-02 12:09:34 +08:00
commit e70b01cdca
2785 changed files with 575579 additions and 0 deletions

View File

@@ -0,0 +1,114 @@
---
title: 未命名
date: 2025-04-10 09:14:41
excerpt:
tags:
rating: ⭐
---
# 错误日志
```c++
UATHelper: Packaging (Android (ASTC)): LogInit: Display: LogShaderCompilers: Warning: Failed to compile Material /ShaderWorld/Material/MSPresets/MS_Foliage_Material/MasterMaterials/MA_Impostor.MA_Impostor (MI:/ShaderWorld/Spawnables/BlackAlder/Materials/Impostor/MAI_Impostor_BlackAlder.MAI_Impostor_BlackAlder) for platform SF_VULKAN_ES31_ANDROID, Default Material will be used in game.
UATHelper: Packaging (Android (ASTC)): /Engine/Generated/Material.ush:3672:27: error: no matching function for call to 'transpose'
UATHelper: Packaging (Android (ASTC)): return mul(InWorldVector, transpose(Parameters.InstanceLocalToWorld));
UATHelper: Packaging (Android (ASTC)): ^~~~~~~~~
UATHelper: Packaging (Android (ASTC)): /Engine/Generated/Material.ush:3672:27: note: candidate function not viable: no known conversion from 'FDFMatrix' to 'matrix<float, 1, 1>' for 1st argument
UATHelper: Packaging (Android (ASTC)): return mul(InWorldVector, transpose(Parameters.InstanceLocalToWorld));
UATHelper: Packaging (Android (ASTC)): ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
UATHelper: Packaging (Android (ASTC)): /Engine/Generated/Material.ush:3701:37: error: no matching function for call to 'transpose'
UATHelper: Packaging (Android (ASTC)): return mul(InWorldVector, (float3x3)transpose(Parameters.InstanceLocalToWorld)) / (temp*temp);
UATHelper: Packaging (Android (ASTC)): ^~~~~~~~~
UATHelper: Packaging (Android (ASTC)): /Engine/Generated/Material.ush:3701:37: note: candidate function not viable: no known conversion from 'FDFMatrix' to 'matrix<float, 1, 1>' for 1st argument
UATHelper: Packaging (Android (ASTC)): return mul(InWorldVector, (float3x3)transpose(Parameters.InstanceLocalToWorld)) / (temp*temp);
UATHelper: Packaging (Android (ASTC)): ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
UATHelper: Packaging (Android (ASTC)): /Engine/Generated/Material.ush:3722:27: error: no matching function for call to 'transpose'
UATHelper: Packaging (Android (ASTC)): return mul(InWorldVector, transpose(Parameters.InstanceLocalToWorld));
UATHelper: Packaging (Android (ASTC)): ^~~~~~~~~
UATHelper: Packaging (Android (ASTC)): /Engine/Generated/Material.ush:3722:27: note: candidate function not viable: no known conversion from 'FDFMatrix' to 'matrix<float, 1, 1>' for 1st argument
UATHelper: Packaging (Android (ASTC)): return mul(InWorldVector, transpose(Parameters.InstanceLocalToWorld));
UATHelper: Packaging (Android (ASTC)): ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
```
搜索结果大致是:
```c++
MaterialFloat3 CustomExpression1(FMaterialVertexParameters Parameters,float3 InWorldVector, FWSVector3 LWCInWorldVector)
{
#if USE_INSTANCING || IS_MESHPARTICLE_FACTORY
return mul(InWorldVector, transpose(Parameters.InstanceLocalToWorld));
#else
return mul(InWorldVector, (MaterialFloat3x3)LWCToFloat(GetPrimitiveData(Parameters.PrimitiveId).WorldToLocal));
#endif
}
MaterialFloat3 CustomExpression4(FMaterialVertexParameters Parameters,MaterialFloat3 InWorldVector)
{
#if USE_INSTANCING || IS_MESHPARTICLE_FACTORY
float3 temp;
temp.x = length(TransformLocalVectorToWorld(Parameters, float3(1,0,0)));
temp.y = length(TransformLocalVectorToWorld(Parameters, float3(0,1,0)));
temp.z = length(TransformLocalVectorToWorld(Parameters, float3(0,0,1)));
return mul(InWorldVector, (MaterialFloat3x3)transpose(Parameters.InstanceLocalToWorld)) / (temp*temp);
#else
return mul(InWorldVector, (MaterialFloat3x3)LWCToFloat(GetPrimitiveData(Parameters.PrimitiveId).WorldToLocal));
#endif
}
MaterialFloat3 CustomExpression6(FMaterialVertexParameters Parameters,MaterialFloat3 InWorldVector)
{
#if USE_INSTANCING || IS_MESHPARTICLE_FACTORY
return mul(InWorldVector, transpose(Parameters.InstanceLocalToWorld));
#else
return mul(InWorldVector, (MaterialFloat3x3)LWCToFloat(GetPrimitiveData(Parameters.PrimitiveId).WorldToLocal));
#endif
}
MaterialFloat3 CustomExpression6(FMaterialVertexParameters Parameters,MaterialFloat3 InWorldVector)
{
#if USE_INSTANCING || IS_MESHPARTICLE_FACTORY
return mul(InWorldVector, transpose(Parameters.InstanceLocalToWorld));
#else
return mul(InWorldVector, (MaterialFloat3x3)LWCToFloat(GetPrimitiveData(Parameters.PrimitiveId).WorldToLocal));
#endif
}
MaterialFloat3 CustomExpression9(FMaterialVertexParameters Parameters,float3 InWorldVector, FWSVector3 LWCInWorldVector)
{
#if USE_INSTANCING || IS_MESHPARTICLE_FACTORY
return mul(InWorldVector, transpose(Parameters.InstanceLocalToWorld));
#else
return mul(InWorldVector, (MaterialFloat3x3)LWCToFloat(GetPrimitiveData(Parameters.PrimitiveId).WorldToLocal));
#endif
}
MaterialFloat3 CustomExpression12(FMaterialVertexParameters Parameters,MaterialFloat3 InWorldVector)
{
#if USE_INSTANCING || IS_MESHPARTICLE_FACTORY
float3 temp;
temp.x = length(TransformLocalVectorToWorld(Parameters, float3(1,0,0)));
temp.y = length(TransformLocalVectorToWorld(Parameters, float3(0,1,0)));
temp.z = length(TransformLocalVectorToWorld(Parameters, float3(0,0,1)));
return mul(InWorldVector, (MaterialFloat3x3)transpose(Parameters.InstanceLocalToWorld)) / (temp*temp);
#else
return mul(InWorldVector, (MaterialFloat3x3)LWCToFloat(GetPrimitiveData(Parameters.PrimitiveId).WorldToLocal));
#endif
}
```
## 其他bug
- Vulkan & OpenGL Preview 必然崩溃。
##
```c++
#if USE_INSTANCING || USE_INSTANCE_CULLING
float3x3 LocalToWorld = DFToFloat3x3(Parameters.InstanceLocalToWorld);
float3 LocalPosition = Parameters.InstanceLocalPosition;
// skip if this instance is hidden
if (Parameters.PerInstanceParams.y < 1.f)
{
return float3(0,0,0);
}
#else
float3x3 LocalToWorld = DFToFloat3x3(GetPrimitiveData(Parameters).LocalToWorld);
float3 LocalPosition = WSMultiplyDemote(GetWorldPosition(Parameters), Parameters.LWCData.WorldToLocal);
#endif
```

View File

@@ -0,0 +1,9 @@
---
title: UE创建CubeMap
date: 2023-07-28 15:34:15
excerpt:
tags:
rating: ⭐
---
https://www.youtube.com/watch?v=rQXROveBR14

View File

@@ -0,0 +1,10 @@
---
title: Vertex Interpolator材质节点
date: 2022-11-04 10:01:35
excerpt:
tags:
rating: ⭐
---
推荐查看视频https://www.youtube.com/watch?v=KyjlrKwbXCw
本质上是一种将VS数据进行插值最后传递到PS中的节点。需要与CustomUV、VertexColor配合使用。

View File

@@ -0,0 +1,71 @@
---
title: 使用Curve进行深度适配的Outline
date: 2023-07-18 14:47:24
excerpt:
tags:
rating: ⭐
---
# 前言
在UE5.1发现了若干新节点感觉对后处理描边有很大的作用。
![[MultiDraw_OutlineMaterial.png]]
# ControlCurve
<iframe src="https://www.desmos.com/calculator/z9o3k0luyb?embed" width="500" height="500" style="border: 1px solid #ccc" frameborder=0></iframe>
UE单位为cm理论上描边宽度控制范围为10cm~10000cm1000m。假设标准的角色身高为180cm110~200cm变化比较轻微并以此定义一个标准数StandardCharacterHeight经过观察`10~ ControlWidthRangeMax`范围适合使用CurveTexture。而超过ControlWidthRangeMax = StandardCharacterHeight * 2的区域基本是一个线性区间所以可以使用一个线性函数来控制。
以下为原始数据:
| | | | | | | | |
| --- | --- | --- | ---- | --- | ---- | --- | ---- |
| x轴 | 15 | 20 | 25 | 30 | 40 | 60 | 100 |
| y轴 | -12 | -9 | -7.2 | -6 | -4.5 | -3 | -1.8 |
经过重映射后:
| | | | | | | | |
| --- | ----- | ---- | ---- | ------ | ----- | ------- | ---- |
| x轴 | 0.15 | 0.2 | 0.25 | 0.3 | 0.4 | 0.6 | 1 |
| y轴 | 0.667 | 0.75 | 0.8 | 0.8333 | 0.875 | 0.91666 | 0.95 |
考虑需要让描边变得平滑以及让效果更好的考虑,所以以此为基础数据进行了调节(平移曲线并且调整了几个点),以下去本人设置的曲线:![[MultiDraw_OutlineCurve.png|800]]
### 线性函数斜率k的计算
取得ControlWidthRangeMax上一点(360 0.5)与最大范围x=10000的一点(10000 0.018),即可取得斜率 k = 0.0005/1cm。
实际使用0.0005的效果不佳经过调整最终斜率使用0.002。
### Remap
```c++
half invLerp(half from, half to, half value)
{
return (value - from) / (to - from);
}
half invLerpClamp(half from, half to, half value)
{
return saturate(invLerp(from,to,value));
}
// full control remap, but slower
half remap(half origFrom, half origTo, half targetFrom, half targetTo, half value)
{
half rel = invLerp(origFrom, origTo, value);
return lerp(targetFrom, targetTo, rel);
}
```
## FOV
首先确定一下摄像机的FOV范围CineCamera 默认Current Focal Length 为35Current Horizontal FOV为37.497356材质Fov显示为0.6544528弧度制编辑器Camera 默认 FOV90 材质FOV显示1.5707976(弧度制)
- CineCamera
- Current Horizontal FOV范围 1.375033 ~ 143.130096
- 材质 FOV 范围 0.024~2.4
- Camera
- FOV范围 5~170
- 材质 FOV 范围 0.08~2.967
经过观察FOV<90需要使用曲线进行控制大致和Depth曲线差不多再调整一下就好90 < FOV < 170 时OutlineWidth大致呈线性所以大致计算出斜率k=3
| | | | |
| ------------ | --- | --- | --- |
| FOV | 90 | 130 | 170 |
| OutlineWidth | 1 | 3 | 8 |

View File

@@ -0,0 +1,10 @@
---
title: 未命名
date: 2025-03-12 21:08:01
excerpt:
tags:
rating: ⭐
---
PS. InstancedFoliage是没有距离场的
![[材质距离场Mask1.png]]![[材质距离场Mask2.png]]![[材质距离场Mask3.png]]

View File

@@ -0,0 +1,48 @@
---
title: 自定义材质输出节点
date: 2022-09-02 11:30:37
excerpt:
tags:
rating: ⭐
---
## 前言
参考文章https://zhuanlan.zhihu.com/p/163121357
## 自定义材质输出节点
继承`UMaterialExpressionCustomOutput`类并实现对应函数即可。
具体可以参考`BentNormal`材质输出节点。Shader代码位于BasePassPixelShader.usf的ApplyBentNormal()CPP代码位于UMaterialExpressionBentNormalCustomOutput类中UE4.27)。这种节点会生成`NUM_MATERIAL_OUTPUTS_节点名`的宏。
之后就可以在BasePassPixelShader.usf中通过宏与函数获取到对应的节点计算结果。比如
```c++
void ApplyBentNormal( in FMaterialPixelParameters MaterialParameters, in float Roughness, inout float3 BentNormal, inout float DiffOcclusion, inout float SpecOcclusion )
{
#if NUM_MATERIAL_OUTPUTS_GETBENTNORMAL > 0
#if MATERIAL_TANGENTSPACENORMAL
BentNormal = normalize( TransformTangentVectorToWorld( MaterialParameters.TangentToWorld, GetBentNormal0(MaterialParameters) ) );
#else
BentNormal = GetBentNormal0(MaterialParameters);
#endif
FSphericalGaussian HemisphereSG = Hemisphere_ToSphericalGaussian( MaterialParameters.WorldNormal );
FSphericalGaussian NormalSG = ClampedCosine_ToSphericalGaussian( MaterialParameters.WorldNormal );
FSphericalGaussian VisibleSG = BentNormalAO_ToSphericalGaussian( BentNormal, DiffOcclusion );
FSphericalGaussian DiffuseSG = Mul( NormalSG, VisibleSG );
float VisibleCosAngle = sqrt( 1 - DiffOcclusion );
#if 1 // Mix full resolution normal with low res bent normal
BentNormal = DiffuseSG.Axis;
//DiffOcclusion = saturate( Integral( DiffuseSG ) / Dot( NormalSG, HemisphereSG ) );
DiffOcclusion = saturate( Integral( DiffuseSG ) * 0.42276995 );
#endif
float3 N = MaterialParameters.WorldNormal;
float3 V = MaterialParameters.CameraVector;
SpecOcclusion = DotSpecularSG( Roughness, N, V, VisibleSG );
SpecOcclusion /= DotSpecularSG( Roughness, N, V, HemisphereSG );
SpecOcclusion = saturate( SpecOcclusion );
#endif
}
```