Init
This commit is contained in:
114
03-UnrealEngine/Rendering/Material/ShaderWorld Debug笔记.md
Normal file
114
03-UnrealEngine/Rendering/Material/ShaderWorld Debug笔记.md
Normal 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
|
||||
```
|
9
03-UnrealEngine/Rendering/Material/UE创建CubeMap.md
Normal file
9
03-UnrealEngine/Rendering/Material/UE创建CubeMap.md
Normal 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
|
@@ -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配合使用。
|
71
03-UnrealEngine/Rendering/Material/使用Curve进行深度适配的Outline.md
Normal file
71
03-UnrealEngine/Rendering/Material/使用Curve进行深度适配的Outline.md
Normal 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~10000cm(1000m)。假设标准的角色身高为180cm(110~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 为35,Current Horizontal FOV为37.497356,材质Fov显示为0.6544528(弧度制);编辑器Camera 默认 FOV:90 材质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 |
|
10
03-UnrealEngine/Rendering/Material/材质距离场Mask.md
Normal file
10
03-UnrealEngine/Rendering/Material/材质距离场Mask.md
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: 未命名
|
||||
date: 2025-03-12 21:08:01
|
||||
excerpt:
|
||||
tags:
|
||||
rating: ⭐
|
||||
---
|
||||
PS. InstancedFoliage是没有距离场的
|
||||
|
||||
![[材质距离场Mask1.png]]![[材质距离场Mask2.png]]![[材质距离场Mask3.png]]
|
48
03-UnrealEngine/Rendering/Material/自定义材质输出节点.md
Normal file
48
03-UnrealEngine/Rendering/Material/自定义材质输出节点.md
Normal 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
|
||||
}
|
||||
```
|
Reference in New Issue
Block a user