计算着色器调用在构建中的 Blit 调用之后中断,但在编辑器中则不然

问题描述 投票:0回答:1

在 m1 Mac 上使用 unity 2022.3.10f1。

我正在研究绽放效果,遇到了一个奇怪的问题。

private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        Graphics.Blit(source, tempRt);
        Graphics.Blit(source, tempRt2);

        //Compute Shader to get bloomy parts of image
        ExtractBloomLayer.SetTexture(0, "LayerOut", tempRt);
        ExtractBloomLayer.Dispatch(0, tempRt.width / 32, tempRt.height / 32, 1);
        //tempRt now contains the information that I'll blur to make the bloom

        //apply the blur (only one iteration for testing)
        Graphics.Blit(tempRt, tempRt2, blurMat); //SHOULD MAKE WHOLE SCREEN RED

        //sending raw blur to screen (for testing)
        Graphics.Blit(tempRt2, destination);
}

由于使用了blurMat Graphics.Blit,这段代码应该使我的整个屏幕变成红色,并且它在编辑器中按预期工作,但在构建中却不然。如果我注释掉这两条 ExtractBloomLayer 行,构建也会按预期工作(但我需要这些行,并且不能只删除它们。)在构建中,ExtractBloomLayer 计算着色器工作得很好,但模糊Mat blit 却不起作用做任何事。有谁知道这是为什么吗?

我已经尝试了很多使用blurMat着色器的东西,但它总是无法出现在游戏的构建版本中(但同样,只有当计算着色器线处于活动状态时才会中断)

修改着色器剥离选项 https://forum.unity.com/threads/some-shaders-not-rendering-in-build.1412457/ 将着色器放入资产/资源中 https://forum.unity.com/threads/why-this-shader-works-in-editor-but-not-when-i-build-the-game.255756/ 从包中删除 Shadergraph(我是内置的,所以不适用) https://forum.unity.com/threads/standard-cutout-shader-working-in-editor-not-in-build.1223088/ 将着色器放入图形设置中的“始终包含”列表中

到目前为止还没有任何效果。

unity-game-engine shader hlsl unity3d-editor
1个回答
0
投票

我找不到真正的解决方案。相反,我将隔离布隆计算着色器重写为片段着色器并替换了相关行。现在构建可以按预期工作。

我知道过度依赖计算着色器可能不是一个好主意,但它们使用起来更加直观,我通常可以接受它们的缺点。

工作代码:

private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
    Graphics.Blit(source, tempRt, isolateBloomMat);

    if (blurIterations > 50) blurIterations = 50;
    for (int i = 0; i < blurIterations; i++)
    {
        Graphics.Blit(tempRt, tempRt2, blurMat);
        Graphics.Blit(tempRt2, tempRt, blurMat);
    }

    Graphics.Blit(source, tempRt);
    BlurAndAdd.SetTexture(0, "CamIn", tempRt);
    BlurAndAdd.SetTexture(0, "BLayer", tempRt2);
    BlurAndAdd.Dispatch(0, tempRt.width / 32, tempRt.height / 32, 1);
    Graphics.Blit(tempRt, destination);
}
© www.soinside.com 2019 - 2024. All rights reserved.