ue4.26 通过材质开关控制mesh pass的blend function

一,mesh pass中blend function的设置方法

在mesh pass中设置blend function有如下几种方式:

1,在CreateXXXProcessor (返回FXXXProcessor)中:

 2,FXXXProcessor::AddMeshBatch中:

 3,FXXXProcessor::Process中:

 4,RenderXXX中:

 

二,材质开关访问途径

我们知道,访问材质开关有以下几种途径:

1,通过FMaterialRelevance

  ((StaticMeshSceneProxy)PrimitiveSceneProxy).MaterialRelevance.bXXX;

2,通过UMaterial

  Material.bXXX

3,通过FMaterialResource (public FMaterial):

  MaterialResource.IsEnableXXX()

 

三,在mesh pass中访问材质开关

以Distortion pass为例,其SetBlendState是写在CreateDistortionPassProcessor中的,为Add one one:

现在假设我们已经添加了材质开关bDistortionBlendFuncOverride,下面看如何通过这个开关去控制把blend func切换为Add one zero。

由于CreateDistortionPassProcessor中不方便访问到材质开关,而且CreateDistortionPassProcessor为一个创建函数,其中设置blendState只是初始化,只会在特定时刻调用,意味着即使人们在这里面加了条件判断,那么当我们切换开关状态时因为不会再重新创建processor,所以也不会生效。所以还是应该在后面频繁调用的函数中去设置。

比如可以选择在FDistortionMeshProcessor::Process中去设置:

void FDistortionMeshProcessor::Process(
const FMeshBatch& MeshBatch,
uint64 BatchElementMask,
const FPrimitiveSceneProxy* RESTRICT PrimitiveSceneProxy,
int32 StaticMeshId,
const FMaterialRenderProxy& RESTRICT MaterialRenderProxy,
const FMaterial& RESTRICT MaterialResource,
ERasterizerFillMode MeshFillMode,
ERasterizerCullMode MeshCullMode)
{
  const FVertexFactory* VertexFactory = MeshBatch.VertexFactory;

  TMeshProcessorShaders<
  FDistortionMeshVS,
  FDistortionMeshHS,
  FDistortionMeshDS,
  FDistortionMeshPS> DistortionPassShaders;

  GetDistortionPassShaders(
    MaterialResource,
    VertexFactory->GetType(),
    FeatureLevel,
    DistortionPassShaders.HullShader,
    DistortionPassShaders.DomainShader,
    DistortionPassShaders.VertexShader,
    DistortionPassShaders.PixelShader
  );

  FMeshMaterialShaderElementData ShaderElementData;
  ShaderElementData.InitializeMeshMaterialData(ViewIfDynamicMeshCommand, PrimitiveSceneProxy, MeshBatch, StaticMeshId, false);

  const FMeshDrawCommandSortKey SortKey = CalculateMeshStaticSortKey(DistortionPassShaders.VertexShader, DistortionPassShaders.PixelShader);

  //yang chao begin
   if (MaterialResource.IsEnableDistortionBlendFuncOverride() == true) {
    PassDrawRenderState.SetBlendState(TStaticBlendState<CW_RGBA, BO_Add, BF_One, BF_Zero, BO_Add, BF_Zero, BF_One>::GetRHI());
  }else{
    PassDrawRenderState.SetBlendState(TStaticBlendState<CW_RGBA, BO_Add, BF_One, BF_One, BO_Add, BF_One, BF_One>::GetRHI());
  }
  //yang chao end

  BuildMeshDrawCommands(
    MeshBatch,
    BatchElementMask,
    PrimitiveSceneProxy,
    MaterialRenderProxy,
    MaterialResource,
    PassDrawRenderState,
    DistortionPassShaders,
    MeshFillMode,
    MeshCullMode,
    SortKey,
    EMeshPassFeatures::Default,
    ShaderElementData);
}

  

posted on   wantnon  阅读(65)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
历史上的今天:
2016-04-28 unity, Graphics.Blit (null, null, mat,0);

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示