armory/Shaders/std/sdf.glsl
2017-06-06 18:29:33 +02:00

48 lines
1 KiB
GLSL

const float res = 50.0; // sdftex res
uniform sampler2D sdftex;
float mapsdf(vec3 ro, vec3 rd) {
vec3 p = ro + rd;
p = clamp(p, vec3(-1.0), vec3(1.0));
p = p * 0.5 + 0.5;
float s1 = (p.z * res);
float s2 = int(s1);
float s = s2 - s1;
float m = sign(rd.z) > 0.0 ? s : (1.0 - s);
vec2 co = vec2(p.x / res + s2 / res, p.y);
float dist = (texture(sdftex, co).r) * m;
co.x += 1 / res * sign(rd.z);
dist += (texture(sdftex, co).r) * (1.0 - m);
return dist;
}
float mapsdf2(vec3 p, vec3 rd) {
// p = p * 0.5 + 0.5;
// float s = int(p.z * res);
// vec2 co = vec2(p.x / res + s / res, p.y);
// return texture(sdftex, co).r;
p = p * 0.5 + 0.5;
float s1 = (p.z * res);
float s2 = int(s1);
float s = s2 - s1;
float m = sign(rd.z) > 0.0 ? s : (1.0 - s);
vec2 co = vec2(p.x / res + s2 / res, p.y);
float dist = texture(sdftex, co).r * m;
co.x += 1 / res * sign(rd.z);
dist += (texture(sdftex, co).r) * (1.0 - m);
return dist;
}
float sdBox(vec3 p, vec3 b) {
vec3 d = abs(p) - b;
return min(max(d.x, max(d.y, d.z)), 0.0) + length(max(d, 0.0));
}