LYGIA Shader Library

raymarch (lygia/lighting/raymarch)

Raymarching template where it needs to define a vec4 raymarchMap( in vec3 pos )

Dependencies:

Use:

<vec4> raymarch(<vec3> camera, <vec2> st)

Check it on Github


#ifndef RAYMARCH_CAMERA_MATRIX_FNC
#define RAYMARCH_CAMERA_MATRIX_FNC raymarchCamera
#endif

#ifndef RAYMARCH_RENDER_FNC
#define RAYMARCH_RENDER_FNC raymarchDefaultRender
#endif

#ifndef RAYMARCH_CAMERA_FOV
#define RAYMARCH_CAMERA_FOV 3.0
#endif

#ifndef RAYMARCH_CAMERA_SCALE
#define RAYMARCH_CAMERA_SCALE 0.11
#endif


#ifndef ENG_RAYMARCHING
#define ENG_RAYMARCHING
vec4 raymarch(vec3 camera, vec3 ta, vec2 st) {
    mat3 ca = RAYMARCH_CAMERA_MATRIX_FNC(camera, ta);

#if defined(RAYMARCH_MULTISAMPLE)
    vec4 color = vec4(0.0);
    vec2 pixel = 1.0/RESOLUTION;
    vec2 offset = rotate( vec2(0.5, 0.0), HALF_PI/4.);

    for (int i = 0; i < RAYMARCH_MULTISAMPLE; i++) {
        vec3 rd = ca * normalize(vec3((st + offset * pixel)*2.0-1.0, RAYMARCH_CAMERA_FOV));
        color += RAYMARCH_RENDER_FNC( camera * RAYMARCH_CAMERA_SCALE, rd);
        offset = rotate(offset, HALF_PI);
    }
    return color/float(RAYMARCH_MULTISAMPLE);
#else
    vec3 rd = ca * normalize(vec3(st*2.0-1.0, RAYMARCH_CAMERA_FOV));
    return RAYMARCH_RENDER_FNC( camera * RAYMARCH_CAMERA_SCALE, rd);
#endif
}

vec4 raymarch(vec3 camera, vec2 st) {
    return raymarch(camera, vec3(0.0), st);
}

#endif

Dependencies:

Use:

<float4> raymarch(<float3> camera, <float2> st)

Check it on Github


#ifndef RAYMARCH_CAMERA_MATRIX_FNC
#define RAYMARCH_CAMERA_MATRIX_FNC raymarchCamera
#endif

#ifndef RAYMARCH_RENDER_FNC
#define RAYMARCH_RENDER_FNC raymarchDefaultRender
#endif

#ifndef RESOLUTION
#define RESOLUTION _ScreenParams.xy
#endif

#ifndef RAYMARCH_CAMERA_FOV
#define RAYMARCH_CAMERA_FOV 3.0
#endif

#ifndef RAYMARCH_CAMERA_SCALE
#define RAYMARCH_CAMERA_SCALE 0.11
#endif


#ifndef ENG_RAYMARCH
#define ENG_RAYMARCH

float4 raymarch(float3 camera, float3 ta, float2 st) {
    float3x3 ca = RAYMARCH_CAMERA_MATRIX_FNC(camera, ta);

#if defined(RAYMARCH_MULTISAMPLE)
    float4 color = float4(0.0, 0.0, 0.0, 0.0);
    float2 pixel = 1.0/ RESOLUTION;
    float2 offset = rotate( float2(0.5, 0.0), HALF_PI/4.);

    for (int i = 0; i < RAYMARCH_MULTISAMPLE; i++) {    
        float3 rd = mul(ca, normalize(float3( (st + offset * pixel)*2.0-1.0, RAYMARCH_CAMERA_FOV)) );
        color += RAYMARCH_RENDER_FNC( camera * RAYMARCH_CAMERA_SCALE, rd);
        offset = rotate(offset, HALF_PI);
    }
    return color/float(RAYMARCH_MULTISAMPLE);
#else
    float3 rd = mul(ca, normalize(float3(st * 2.0 - 1.0, RAYMARCH_CAMERA_FOV)));
    return RAYMARCH_RENDER_FNC(camera * RAYMARCH_CAMERA_SCALE, rd);
#endif
}

float4 raymarch(float3 camera, float2 st) {
    return raymarch(camera, float3(0.0, 0.0, 0.0), st);
}

#endif

Examples

Licenses

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.

Get the latest news and releases

Sign up for the news letter bellow, joing the LYGIA's channel on Discord or follow the Github repository