Unity 计算着色器产生意想不到的纹理

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

我刚刚开始在 Unity Engine 中使用计算机着色器,现在我的计算着色器中只有这个方法:

int Iterations = 1000;

[numthreads(8,8,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
    [unroll(1000)] for (int i = 0; i < Iterations; i++)
    {
        Result[id.xy] = float4(1, 0, 0, 1.0);
        return;
    }
    Result[id.xy] = float4(0, 0, 1, 1.0);
}

我期望输出纹理是完全红色的,但它是蓝色的。然而,据我的理解,这意味着 for 循环没有被执行或者 return 语句不起作用。 但这两件事对我来说似乎都没有意义,所以有人可以向我解释这是怎么回事吗?

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

最新的 Hlsl 编译器不再公开变量(这是 fx 框架等旧版本的一些遗留问题)。

Unity 还需要公开您的变量(您可以在其中设置应采用的默认值,并最终在 C# 脚本中进行修改)。

所以必须在外部设置。 DirectX 中未初始化的资源(例如:未绑定资源)通常会生成 0,所以是的,您的循环根本不会执行。

请注意,编译器还会完全删除您的情况下的循环(无论展开值如何),因为它检测到它最多会运行一次。

因此着色器生成的字节码看起来与此等效:

int Iterations = 1000;

[numthreads(8,8,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
    if (Iterations > 0)
    {
        Result[id.xy] = float4(1, 0, 0, 1.0);
    }
    else
    {
        Result[id.xy] = float4(0, 0, 1, 1.0);
    }     
}
© www.soinside.com 2019 - 2024. All rights reserved.