实现动态If材质节点后触发了内存申请的崩溃

我正在做的工作是实现材质的动态If功能,进一步地优化shader中的性能。目前功能已经实现了,翻译出来的HLSL如下:

<br/>

<br/>

<br/>

`void CalcPixelMaterialInputs(in out FMaterialPixelParameters Parameters, in out FPixelMaterialInputs PixelMaterialInputs)
{

// Now the rest of the inputs
MaterialFloat4 Local49 = ProcessMaterialColorTextureLookup(Texture2DSampleBias(Material.Texture2D_2, Material.Texture2D_2Sampler,Local28,View.MaterialTextureMipBias));
MaterialFloat3 Local50 = (Material.VectorExpressions[7].rgb * Local49.rgba.rgb);
MaterialFloat3 Local55 = 0;

[branch]
if(Material.ScalarExpressions[1].y >= 0.01200000)
{
MaterialFloat2 Local45 = Parameters.TexCoords[2].xy;
MaterialFloat4 Local46 = ProcessMaterialLinearColorTextureLookup(Texture2DSampleBias(Material.Texture2D_1, Material.Texture2D_1Sampler,Local45,View.MaterialTextureMipBias));
MaterialFloat3 Local47 = (Local46.rgb * Material.VectorExpressions[5].rgb);
MaterialFloat Local48 = lerp(Material.ScalarExpressions[1].x,Material.ScalarExpressions[0].w,0.50000000);
MaterialFloat3 Local51 = Local50;
MaterialFloat3 Local52 = (Local48 * Local51);
MaterialFloat3 Local53 = (Local47 * Local52);
MaterialFloat3 Local54 = (MaterialFloat3(0.10000000,0.20000000,0.30000001) + Local53);
Local55 = Local54;
}
else
{
Local55 = MaterialFloat3(0.00000000,1.00000000,0.64885044);
}


}`<br/>

<br/>

在项目中测试的时候在某些情况下遇到了崩溃。崩溃栈如下。[Image Removed]

<br/>

最后经过注释代码的方式,找到了会触发崩溃的核心代码。

生成DynamicIf Definition的代码为,会触发上面的崩溃。

<br/>

[Image Removed]

而把*GetParameterCode(A), 改成TEXT(“Material.ScalarExpressions[1].y”),就不会触发崩溃。

[Image Removed]

<br/>

但是如果在前面执行FString PA= GetParameterCode(A);也会触发崩溃。

[Image Removed]

<br/>

目前的现象是材质的编译没有什么问题,但是会在之后的创建shader申请内存时崩溃。目前我这边没什么思路了,请帮忙分析指点一下。非常感谢!需要什么其他信息,我随时提供。

Hi,

我不是很确定,但感觉应该是某个字符串指针指向了一个局部变量的​FString的地址,所以地址是一个无效地址。最好能用复现后,用vs debug一下。

感谢答复,我试一下