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
,之前没有)
我正在 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
,之前没有)