在编辑器中工作的 RenderTexture 透明度在构建中变为纯色

RenderTexture transparency working in editor becomes solid color in build

我目前正在尝试让我的生长算法在纹理上工作。

当 运行 在编辑器中时,一切都按预期工作,但是一旦我构建项目,整个 RenderTexture 变成纯色(红色、绿色或蓝色 [R8G8B8A8_UNORM] 取决于颜色格式),上面是模拟。

我已经尝试使用 HDRP 无光照纹理着色器而不是我的自定义透明度着色器,这产生了同样的问题,使我相信我的错误在于绘制到纹理上的计算着色器中的某个地方。另外,我使用 URP 重建项目,不幸的是也产生了相同的结果。

另一件事,我最近注意到在编辑器中运行时将游戏 window 最小化和最大化会不止一次导致 unity 崩溃,尽管我无法想象这与手头的问题有什么关系.

编辑: 刚刚为 windows (DX11) 构建了相同的项目,效果很好。因此,这似乎是金属 API.

的问题

有趣的是,maximizing/minimizing问题仅在启用垂直同步并使用触摸板手势时出现。

Unity 版本 2021.2.12f1MacOS Monterey 12.2.1 上使用 HDRP

GitHub 如果您想重现错误:https://github.com/whatphilipcodes/seed

计算下面的着色器代码。

    // mean filter code (DrawTrails) courtesy of https://github.com/DenizBicer/Physarum
    // (Modified)
    
    // Each #kernel tells which function to compile; you can have many kernels
    #pragma kernel DrawPoints
    #pragma kernel DrawTrails
    
    // Create a RenderTexture with enableRandomWrite flag and set it
    // with cs.SetTexture
    
    // texture
    shared RWTexture2D<float4> Result;
    //RWTexture2D<float> TrailBuffer;
    int _texres;
    int _colres;
    float4 _pcol;
    
    // testing
    float _decay;
    
    // buffer
    StructuredBuffer<float2> pointsBuffer;
    StructuredBuffer<float4> colorsBuffer;
    
    [numthreads(64,1,1)]
    void DrawPoints (uint3 id : SV_DispatchThreadID)
    {
        if ((pointsBuffer[id.x].x * pointsBuffer[id.x].y) > 0) Result[pointsBuffer[id.x].xy] = colorsBuffer[id.x % _colres];
    }
    
    [numthreads(16,16,1)]
    void DrawTrails (uint3 id : SV_DispatchThreadID)
    {
        float3 value;
    
        value = Result[id.xy].rgb;
    
        float3 d = float3(1, -1, 0.0);
    
        //mean filter red
        value.r = value.r;
        value.r += Result[id.xy - d.xx].r; // -1,-1
        value.r += Result[id.xy - d.zx].r; // 0, -1
        value.r += Result[id.xy - d.yx].r; // +1, -1
        value.r += Result[id.xy - d.xz].r; // -1, 0
        value.r += Result[id.xy + d.xz].r; // +1, 0
        value.r += Result[id.xy + d.yx].r; // -1, +1
        value.r += Result[id.xy + d.zx].r; // 0, +1
        value.r += Result[id.xy + d.xx].r; // +1, +1
    
        value.x = (value.x / 9) * (1 - _decay);
        
        //mean filter green
        value.g = value.g;
        value.g += Result[id.xy - d.xx].g; // -1,-1
        value.g += Result[id.xy - d.zx].g; // 0, -1
        value.g += Result[id.xy - d.yx].g; // +1, -1
        value.g += Result[id.xy - d.xz].g; // -1, 0
        value.g += Result[id.xy + d.xz].g; // +1, 0
        value.g += Result[id.xy + d.yx].g; // -1, +1
        value.g += Result[id.xy + d.zx].g; // 0, +1
        value.g += Result[id.xy + d.xx].g; // +1, +1
    
        value.g = (value.g / 9) * (1 - _decay);
    
        //mean filter blue
        value.b = value.z;
        value.b += Result[id.xy - d.xx].b; // -1,-1
        value.b += Result[id.xy - d.zx].b; // 0, -1
        value.b += Result[id.xy - d.yx].b; // +1, -1
        value.b += Result[id.xy - d.xz].b; // -1, 0
        value.b += Result[id.xy + d.xz].b; // +1, 0
        value.b += Result[id.xy + d.yx].b; // -1, +1
        value.b += Result[id.xy + d.zx].b; // 0, +1
        value.b += Result[id.xy + d.xx].b; // +1, +1
        
        value.b = (value.b / 9) * (1 - _decay);
        
        Result[id.xy] = float4(value.r, value.g, value.b, 0.0);
    }

任何想法都将不胜感激!

我最终解决问题的方法是添加一个将所有像素设置为黑色的内核,从 start() 方法调度。

[numthreads(16,16,1)]
void SetTexture (uint3 id : SV_DispatchThreadID)
{
    Result[id.xy] = float4(0.0, 0.0, 0.0, 0.0);
}

我很确定还有更优雅的解决方案,但目前只能这样做。