我最近开始使用着色器,我想避免使用 switch 语句。
它越来越长,我想知道是否有我可以使用的替代方法或模式。
下面是我的代码。
inline float GetShapeDistance(const float3 pos, const int type, const float3 size)
{
switch (type)
{
case SPHERE:
return Sphere(pos, size.x);
case ELLIPSOID:
return Ellipsoid(pos, size);
case BOX:
return Box(pos, size);
case OCTAHEDRON:
return Octahedron(pos, size.x);
case CAPSULE:
return Capsule(pos, size.xy);
// ...
default:
return Sphere(pos, size.x);
}
}
我不是 hlsl 的专家。然而,根据我的研究,它与 top c 类似,你可以使用指针。 消除长 switch 语句的一种有效方法是使用函数指针数组。这允许您将每种形状类型映射到相应的距离函数。以下是实现此方法的方法:
typedef float (*DistanceFunction)(float3, float3);
float Sphere(float3 pos, float size);
float Ellipsoid(float3 pos, float3 size);
float Box(float3 pos, float3 size);
float Octahedron(float3 pos, float size);
float Capsule(float3 pos, float2 size);
// Define an array of function pointers
DistanceFunction distanceFunctions[] = {
Sphere, // 0: SPHERE
Ellipsoid, // 1: ELLIPSOID
Box, // 2: BOX
Octahedron, // 3: OCTAHEDRON
Capsule // 4: CAPSULE
};
inline float GetShapeDistance(const float3 pos, const int type, const float3 size)
{
if (type < 0 || type >= sizeof(distanceFunctions) / sizeof(distanceFunctions[0]))
{
return Sphere(pos, size.x); // Default case
}
return distanceFunctions[type](pos, size);
}