hlsl - 如何避免使用 switch 语句?

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

我最近开始使用着色器,我想避免使用 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);
    }
}
switch-statement hlsl
1个回答
0
投票

我不是 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.