lygia
/v1.1.6
/lighting
/raymarch
/normal
)calculate normals http://iquilezles.org/www/articles/normalsSDF/normalsSDF.htm
Dependencies:
Use:
<float> raymarchNormal( in <vec3> pos )
#ifndef RAYMARCH_MAP_FNC
#define RAYMARCH_MAP_FNC(POS) raymarchMap(POS)
#endif
#ifndef RAYMARCH_MAP_DISTANCE
#define RAYMARCH_MAP_DISTANCE a
#endif
#ifndef FNC_RAYMARCHNORMAL
#define FNC_RAYMARCHNORMAL
vec3 raymarchNormal(vec3 pos, vec2 pixel) {
vec2 offset = vec2(1.0, -1.0) * pixel;
return normalize( offset.xyy * RAYMARCH_MAP_FNC( pos + offset.xyy ).RAYMARCH_MAP_DISTANCE +
offset.yyx * RAYMARCH_MAP_FNC( pos + offset.yyx ).RAYMARCH_MAP_DISTANCE +
offset.yxy * RAYMARCH_MAP_FNC( pos + offset.yxy ).RAYMARCH_MAP_DISTANCE +
offset.xxx * RAYMARCH_MAP_FNC( pos + offset.xxx ).RAYMARCH_MAP_DISTANCE );
}
vec3 raymarchNormal(vec3 pos, float e) {
vec2 offset = vec2(1.0, -1.0) * e;
return normalize( offset.xyy * RAYMARCH_MAP_FNC( pos + offset.xyy ).RAYMARCH_MAP_DISTANCE +
offset.yyx * RAYMARCH_MAP_FNC( pos + offset.yyx ).RAYMARCH_MAP_DISTANCE +
offset.yxy * RAYMARCH_MAP_FNC( pos + offset.yxy ).RAYMARCH_MAP_DISTANCE +
offset.xxx * RAYMARCH_MAP_FNC( pos + offset.xxx ).RAYMARCH_MAP_DISTANCE );
}
vec3 raymarchNormal( in vec3 pos ) {
return raymarchNormal(pos, 0.5773 * 0.0005);
}
#endif
Dependencies:
Use:
<float> raymarchNormal( in <float3> pos )
#ifndef RAYMARCH_MAP_FNC
#define RAYMARCH_MAP_FNC(POS) raymarchMap(POS)
#endif
#ifndef RAYMARCH_MAP_DISTANCE
#define RAYMARCH_MAP_DISTANCE a
#endif
#ifndef FNC_RAYMARCHNORMAL
#define FNC_RAYMARCHNORMAL
float3 raymarchNormal(float3 pos, float2 pixel) {
float2 offset = float2(1.0, -1.0) * pixel;
return normalize( offset.xyy * RAYMARCH_MAP_FNC( pos + offset.xyy ).RAYMARCH_MAP_DISTANCE +
offset.yyx * RAYMARCH_MAP_FNC( pos + offset.yyx ).RAYMARCH_MAP_DISTANCE +
offset.yxy * RAYMARCH_MAP_FNC( pos + offset.yxy ).RAYMARCH_MAP_DISTANCE +
offset.xxx * RAYMARCH_MAP_FNC( pos + offset.xxx ).RAYMARCH_MAP_DISTANCE );
}
float3 raymarchNormal(float3 pos, float e) {
const float2 offset = float2(1.0, -1.0) * e;
return normalize( offset.xyy * RAYMARCH_MAP_FNC( pos + offset.xyy ).RAYMARCH_MAP_DISTANCE +
offset.yyx * RAYMARCH_MAP_FNC( pos + offset.yyx ).RAYMARCH_MAP_DISTANCE +
offset.yxy * RAYMARCH_MAP_FNC( pos + offset.yxy ).RAYMARCH_MAP_DISTANCE +
offset.xxx * RAYMARCH_MAP_FNC( pos + offset.xxx ).RAYMARCH_MAP_DISTANCE );
}
float3 raymarchNormal( in float3 pos ) {
return raymarchNormal(pos, 0.5773 * 0.0005);
}
#endif
Dependencies:
lygia
/v1.1.6
/math
/make
.glsl
lygia
/v1.1.6
/math
/normalize
.glsl
lygia
/v1.1.6
/lighting
/raymarch
/map
.glsl
Use:
<float> raymarchNormal( in <float3> pos )
#ifndef RAYMARCH_MAP_FNC
#define RAYMARCH_MAP_FNC(POS) raymarchMap(POS)
#endif
#ifndef RAYMARCH_MAP_DISTANCE
#define RAYMARCH_MAP_DISTANCE w
#endif
#ifndef FNC_RAYMARCHNORMAL
#define FNC_RAYMARCHNORMAL
inline __host__ __device__ float3 raymarchNormal(const float3& pos, float2 pixel) {
float2 offset = make_float2(1.0f, -1.0f) * pixel;
float3 offset_xyy = make_float3(offset.x, offset.y, offset.y);
float3 offset_yyx = make_float3(offset.y, offset.y, offset.x);
float3 offset_yxy = make_float3(offset.y, offset.x, offset.y);
float3 offset_xxx = make_float3(offset.x, offset.x, offset.x);
return normalize( offset_xyy * RAYMARCH_MAP_FNC( pos + offset_xyy ).RAYMARCH_MAP_DISTANCE +
offset_yyx * RAYMARCH_MAP_FNC( pos + offset_yyx ).RAYMARCH_MAP_DISTANCE +
offset_yxy * RAYMARCH_MAP_FNC( pos + offset_yxy ).RAYMARCH_MAP_DISTANCE +
offset_xxx * RAYMARCH_MAP_FNC( pos + offset_xxx ).RAYMARCH_MAP_DISTANCE );
}
inline __host__ __device__ float3 raymarchNormal(const float3& pos, float e) {
const float2 offset = make_float2(1.0f, -1.0f) * e;
float3 offset_xyy = make_float3(offset.x, offset.y, offset.y);
float3 offset_yyx = make_float3(offset.y, offset.y, offset.x);
float3 offset_yxy = make_float3(offset.y, offset.x, offset.y);
float3 offset_xxx = make_float3(offset.x, offset.x, offset.x);
return normalize( offset_xyy * RAYMARCH_MAP_FNC( pos + offset_xyy ).RAYMARCH_MAP_DISTANCE +
offset_yyx * RAYMARCH_MAP_FNC( pos + offset_yyx ).RAYMARCH_MAP_DISTANCE +
offset_yxy * RAYMARCH_MAP_FNC( pos + offset_yxy ).RAYMARCH_MAP_DISTANCE +
offset_xxx * RAYMARCH_MAP_FNC( pos + offset_xxx ).RAYMARCH_MAP_DISTANCE );
}
inline __host__ __device__ float3 raymarchNormal(const float3& pos) {
return raymarchNormal(pos, 0.5773f * 0.0005f);
}
#endif
LYGIA is dual-licensed under the Prosperity License and the Patron License for sponsors and contributors.
Sponsors and contributors are automatically added to the Patron License and they can ignore the any non-commercial rule of the Prosperity Licensed software (please take a look to the exception).
It's also possible to get a permanent comercial license hook to a single and specific version of LYGIA.
Sign up for the news letter bellow, joing the LYGIA's channel on Discord or follow the Github repository