HLSL 数组索引返回意外值

HLSL Array Indexing Returning Unexpected Values

我正在 Unity 中的 GPU 上执行一些 HLSL 代码,但我在从数组中获取值时遇到问题。这是我的简化代码示例。

C#

ComputeBuffer meshVerticesBuffer = new ComputeBuffer(
  15 * 1,
  sizeof(float) * 3
);
marchingCubesShader.SetBuffer(0, "MeshVertices", meshVerticesBuffer);
marchingCubesShader.Dispatch(0, 1, 1, 1);

Vector3[] meshVertices = new Vector3[15 * 1];
meshVerticesBuffer.GetData(meshVertices);
meshVerticesBuffer.Release();

HLSL

#pragma kernel ApplyMarchingCubes

int EDGE_TABLE[][15] = {
    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
    ...255 more irrelevant entries
};

RWStructuredBuffer<float3> MeshVertices;

[numthreads(4, 4, 4)]
void ApplyMarchingCubes(uint3 id : SV_DispatchThreadID)
{
    MeshVertices[0] = float3(0, 0, EDGE_TABLE[0][0]);
}

我正在通过调试器在 C# 端观察 meshVertices,第一项始终是 Vector3(0, 0, 0)。我期待 Vector3(0, 0, -1) 的结果。我做错了什么?

我弄清楚为什么数组没有给出正确的值。 在 HLSL 中,在同一行中声明和初始化数组时,必须包含 static 关键字。

我的 HLSL 代码应该是:

#pragma kernel ApplyMarchingCubes

static int EDGE_TABLE[][15] = {
    {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
    ...255 more irrelevant entries
};

RWStructuredBuffer<float3> MeshVertices;

[numthreads(4, 4, 4)]
void ApplyMarchingCubes(uint3 id : SV_DispatchThreadID)
{
    MeshVertices[0] = float3(0, 0, EDGE_TABLE[0][0]);
}

(注意第三行static,之前没有)