在编辑器中工作的 RenderTexture 透明度在构建中变为纯色
RenderTexture transparency working in editor becomes solid color in build
- in editor
- in build
我目前正在尝试让我的生长算法在纹理上工作。
当 运行 在编辑器中时,一切都按预期工作,但是一旦我构建项目,整个 RenderTexture 变成纯色(红色、绿色或蓝色 [R8G8B8A8_UNORM] 取决于颜色格式),上面是模拟。
我已经尝试使用 HDRP 无光照纹理着色器而不是我的自定义透明度着色器,这产生了同样的问题,使我相信我的错误在于绘制到纹理上的计算着色器中的某个地方。另外,我使用 URP 重建项目,不幸的是也产生了相同的结果。
另一件事,我最近注意到在编辑器中运行时将游戏 window 最小化和最大化会不止一次导致 unity 崩溃,尽管我无法想象这与手头的问题有什么关系.
编辑:
刚刚为 windows (DX11) 构建了相同的项目,效果很好。因此,这似乎是金属 API.
的问题
有趣的是,maximizing/minimizing问题仅在启用垂直同步并使用触摸板手势时出现。
Unity 版本 2021.2.12f1 在 MacOS 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);
}
我很确定还有更优雅的解决方案,但目前只能这样做。
- in editor
- in build
我目前正在尝试让我的生长算法在纹理上工作。
当 运行 在编辑器中时,一切都按预期工作,但是一旦我构建项目,整个 RenderTexture 变成纯色(红色、绿色或蓝色 [R8G8B8A8_UNORM] 取决于颜色格式),上面是模拟。
我已经尝试使用 HDRP 无光照纹理着色器而不是我的自定义透明度着色器,这产生了同样的问题,使我相信我的错误在于绘制到纹理上的计算着色器中的某个地方。另外,我使用 URP 重建项目,不幸的是也产生了相同的结果。
另一件事,我最近注意到在编辑器中运行时将游戏 window 最小化和最大化会不止一次导致 unity 崩溃,尽管我无法想象这与手头的问题有什么关系.
编辑: 刚刚为 windows (DX11) 构建了相同的项目,效果很好。因此,这似乎是金属 API.
的问题有趣的是,maximizing/minimizing问题仅在启用垂直同步并使用触摸板手势时出现。
Unity 版本 2021.2.12f1 在 MacOS 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);
}
我很确定还有更优雅的解决方案,但目前只能这样做。