GLSL和Metal之间的数学差异

时间:2016-09-07 08:27:56

标签: macos glsl metal

我在GLSL玩游戏并得到this effect。我尝试将其转换为金属,但当y-axis小于0时,我得到了一些时髦的结果:

enter image description here

地平线以上的大多数立方体都有这些有趣的曲线裁剪(< 0)。这是我的Metal代码:

static float mod(float x, float y)
{
    return x - y * floor(x/y);
}

static float vmax(float3 v) {
    return max(max(v.x, v.y), v.z);
}

float fBoxCheap(float3 p, float3 b) { //cheap box
    return vmax(abs(p) - b);
}

static float map( float3 p )
{   
    p.x = mod(p.x + 5,10)-5;
    p.y = mod(p.y + 5 ,10)-5;
    p.z = mod(p.z + 5 ,10)-5;

    float box = fBoxCheap(p-float3(0.0,3.0,0.0),float3(4.0,3.0,1.0));

    return box;
}

GLSL中的代码几乎相同:

float vmax(vec3 v) {
    return max(max(v.x, v.y), v.z);
}

float box(vec3 p, vec3 b) { //cheap box
    return vmax(abs(p) - b);
}

float map( vec3 p )
{
    p.x=mod(p.x+3.0,6.0)-3.0;
    p.y=mod(p.y+3.0,6.0)-3.0;
    p.z=mod(p.z+3.0,6.0)-3.0;
    return box( p, vec3(1.,1.,1.) );
}

我该如何解决这个问题? 我对GLSLMetal都很陌生,但我发现Metal因为这些数学问题而更加棘手。

1 个答案:

答案 0 :(得分:1)

我不认为这里有区别。您可以通过应用您在Metal版本中执行的所有相同修改,在GL版本中创建类似的工件。问题是在用mod折叠空格之后抵消该点违反了SDF为Lipschitz连续的要求(即,梯度必须在各处<= 1)。如果您要翻译该框,请在应用mod之前翻译p。