2016-09-07 34 views
3

我玩GLSL並得到this effect。我試圖將其轉換爲金屬,但我得到了一些時髦的結果爲y-axis,當其小於0:GLSL和金屬之間的數學差異

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由於這些數學問題更加棘手。

+0

如果使用p-vec3(0.0,3.0,0.0),我會注意到GLSL中的相同效果。嘗試與p,而不減去任何東西。 – Marius

+0

我試過了。它變得更加有趣。 – sooon

+0

你對mod的定義是什麼? – warrenm

回答

1

我不認爲這裏有區別。您可以通過在金屬版本中應用所有相同的修改來在GL版本中創建類似的工件。問題在於,在用mod摺疊空格之後抵消了該點違反了SDF爲Lipschitz連續的要求(即,所有梯度必須爲< = 1)。如果您想翻譯此框,請在申請mod之前翻譯p。