虚幻5.5中如何扩展shading model数量

随着ShadingModel的不断增加,在5.5.3中通过在ShadingCommon.ush中增加#define SHADINGMODELID_XXX的方式进行ShadingModel的扩展会触发下面的Static Assert,导致cook失败

`//PathTracingCommon.ush
#define SHADINGMODELID_MEDIUM (SHADINGMODELID_NUM + 1)
#define SHADINGMODELID_SOLID_GLASS (SHADINGMODELID_NUM + 2)

HLSL_STATIC_ASSERT(SHADINGMODELID_MEDIUM <= SHADINGMODELID_MASK, “”);
HLSL_STATIC_ASSERT(SHADINGMODELID_SOLID_GLASS <= SHADINGMODELID_MASK, “”);`​

cook报错如下

UATHelper: Cooking (Windows): /Engine/Private/PathTracing/PathTracingCommon.ush:40:1: error: static_assert failed “”

UATHelper: Cooking (Windows): _Static_assert( (14 + 2) <= 0xF , “” );

UATHelper: Cooking (Windows): ^ ~~~~~~~~~~~~~~~~~~~~

UATHelper: Cooking (Windows):

请问需要如何修改才能规避这个StaticAssert并且保证新增的shading model 正常工作,如果直接修改SHADINGMODELID_NUM 和SHADINGMODELID_MASK的宏定义是否会影响其他的逻辑?

您好,由于GBuffer上只预留了4bit给shadingmodel id,所以数量肯定是限制死了,这个mask的只是不可以修改的。

可以参考这个pathtracing添加shadingmodel的方法,不直接在ShadingCommon.ush中修改,而是在使用到这个宏的地方再添加shadingmodel。但有个问题就是这个材质不能在pathtracing下使用了。

或者可以考虑直接替换掉​ SHADINGMODELID_SUBSURFACE,这些shadingmodel应该已经没有什么地方使用了,直接将 SHADINGMODELID_SUBSURFACE 定义为 MASK+1,然后将您的shadingmodel定义为2

需要的,assert用于静态检查新增的 shadingmodel Id 不越界,因为Gbuffer 只有4bit预留

了解,感谢回复。我们会考虑这两种方法进行处理。

你好,还有一个问题想请教一下,SHADINGMODELID_MEDIUM和SHADINGMODELID_SOLID_GLASS 是否要写入GBuffer然后在Lighting阶段读取?如果不是的话,下面这两个Assert的作用是什么?

HLSL_STATIC_ASSERT(SHADINGMODELID_MEDIUM <= SHADINGMODELID_MASK, ""); HLSL_STATIC_ASSERT(SHADINGMODELID_SOLID_GLASS <= SHADINGMODELID_MASK, "");