【发布时间】:2019-06-17 21:11:51
【问题描述】:
我有一个网格和一组点。我想为每个顶点计算数组中最近点的索引。 我有一个有效的例程:
for (int i=0;i<vertexPositions.Length;i++)
{
float minDist = 100000.0f;
int index=0;
float dist;
for (int a=0;a<pointPositions.Length;a++)
{
dist = (vertexPositions[i] - pointPositions[a]).sqrMagnitude;
if (dist<minDist)
{
minDist = dist;
index = a;
}
}
vertexParameter[i] = index;
}
vertexParameter 数组包含所需的结果。如果有很多顶点,这个例程会非常慢,所以我想制作一个执行完全相同操作的计算着色器。但我是 Compute Shaders 的初学者……
这是我的计算着色器代码:
#pragma kernel ClosestPoint
struct vertexData
{
float3 position;
int parameter;
};
struct pointData
{
float3 position;
float parameter;
};
RWStructuredBuffer<vertexData> vertex;
StructuredBuffer<pointData> point;
[numthreads(32, 1, 1)]
void ClosestPoint(uint3 id : SV_DispatchThreadID)
{
int index;
float dist;
float minDist = 1000.0f;
for (uint i = 0; i < point.Length; i++)
{
dist = distance(point[i].position, vertex[id.x].position);
if (dist < minDist)
{
minDist = dist;
index = i;
}
}
vertex[id.x].parameter = index;
}
我不知道为什么,但是这段代码给出了错误的结果。如果我在 Dispatch 调用中修改 ThreadGroups,结果会发生变化,所以我想可能是由于一些同步问题......?
如果需要,这是调用着色器的脚本代码:
vertex = new ComputeBuffer(vertices.Length, System.Runtime.InteropServices.Marshal.SizeOf(typeof(vertexData)));
vertex.SetData(vertices);
point= new ComputeBuffer(points.Length, System.Runtime.InteropServices.Marshal.SizeOf(typeof(pointData)));
point.SetData(points);
shader.SetBuffer(kernelHandle, "vertex", vertex);
shader.SetBuffer(kernelHandle, "point", point);
shader.Dispatch(kernelHandle, 1, 1, 1);
vertex.GetData(vertices);
for (int i = 0; i < vertexParameter.Length; i++)
{
vertexParameter[i] = vertices[i].parameter;
}
vertex.Release();
point.Release();
【问题讨论】:
-
hlsl 代码中的
dxl变量是什么?它似乎没有在那里定义/声明。 -
与之前版本的命名不匹配,现已更正。对不起。
-
我很惊讶
point.Length在 hlsl 中编译。它可能不小心引用了其他东西。尝试添加一个 intcount变量,使用SetInt传入点缓冲区的长度。请参阅here 了解我所说的示例。 -
添加
count变量并没有改变任何东西。但我不知何故部分找到了解决方案。问题似乎是我没有调度正确数量的线程。如果我在着色器中设置 ` [numthreads(32, 1, 1)] ` 并且shader.Dispatch(kernelHandle, vertices.Length, 1, 1);例程会给出正确的结果。但是有这么多线程组,都只有一个线程,似乎是非常糟糕的优化......
标签: c# unity3d directx hlsl compute-shader