Search code examples
glslshaderpixel

Volumetrics in a pixel shader


I have this shadertoy at: https://www.shadertoy.com/view/4sVfz1 I seem to get most of the routines of volume ray marching but I am missing something in my ray marching function that computes transparency according to the accumulated density at a point. Here is my ray marching function:

float ray( vec3 ro, vec3 rd, out float d, out float den )
{

    float t = 0.0; d = EPS; den = 0.0;

    for( int i = 0; i < STEPS; ++i )
    {

        vec3 p = ro + rd * t;
        d = 0.3 * map( p, den ).x;
        if( d < EPS || den > 1.0 || t > FAR ) break;
        t += d;
        den = fbm( p + TWA );
        den += clamp( den, -1.0, 0.0 ) * t * t;

    }

    return t;
}    

Solution

  • The proper ray marching function is this one:

    float ray( vec3 ro, vec3 rd, out float den )
    {
    
        float t = 0.0, maxD = 0.0; den = 0.0;
    
        for( int i = 0; i < STEPS; ++i )
        {
    
            vec3 p = ro + rd * t;
    
            den = map( p );
            maxD = maxD < den ? den : maxD;
    
            if( maxD > 0.99 || t > FAR ) break;
    
            t += 0.05;
    
        }
    
        den = maxD;
    
        return t;
    
    }