Procedural Texture

Grafika którą widzicie powyżej jest prostym przykładem omawianego Procedural Texture. Czyli... Co to właściwie oznacza?

Procedural Texture to obraz generowany komputerowo, czyli bez większego nakładu pracy. Za pomocą algorytmów jesteśmy w stanie realistycznie odwzorować materiały i elementy naturalne typu drewno i odmiany kamienia tj. marmur czy granit. Raczej zazwyczaj pożądany efekt uzyskuję się przy pomocy funkcji fraktalnych "noise" oraz "turbulence". Wspomniane funkcje są odpowiednikami przypadkowości natury, bo jak wiemy nic w naturze nie jest takie samo.
Jest wiele programów oferujących taki efekt. Oto kilka z nich:
  • Allegorithmic Substance
  • Genetica
  • DarkTree
  • Filter Forge
  • Texture Garden
  • Enhance Textures
  • Context Free Art
Informacje na temat "Procedural Texture" będą wam potrzebne do kolejny postów gdzie będę opisywał "noise'y", czyli szumy, które są częścią tych tekstur proceduralnych.

Poniżej zamieszczam przykładowy kod tekstury proceduralnej, który został przedstawiony w książce Steve'a Upstill'a:
 /* Copyrighted Pixar 1988 */
 /* From the RenderMan Companion p. 355 */
 /* Listing 16.19  Blue marble surface shader*/

 /*
  * blue_marble(): a marble stone texture in shades of blue
  * surface
  */

 blue_marble(
          float   Ks    = .4,
                  Kd    = .6,
                  Ka    = .1,
                  roughness = .1,
                  txtscale = 1;
          color   specularcolor = 1)
 {
    point PP;            /* scaled point in shader space */
    float csp;           /* color spline parameter */
    point Nf;            /* forward-facing normal */
    point V;             /* for specular() */
    float pixelsize, twice, scale, weight, turbulence;

    /* Obtain a forward-facing normal for lighting calculations. */
    Nf = faceforward( normalize(N), I);
    V = normalize(-I);

    /*
     * Compute "turbulence" a la [PERLIN85]. Turbulence is a sum of
     * "noise" components with a "fractal" 1/f power spectrum. It gives the
     * visual impression of turbulent fluid flow (for example, as in the
     * formation of blue_marble from molten color splines!). Use the
     * surface element area in texture space to control the number of
     * noise components so that the frequency content is appropriate
     * to the scale. This prevents aliasing of the texture.
     */
    PP = transform("shader", P) * txtscale;
    pixelsize = sqrt(area(PP));
    twice = 2 * pixelsize;
    turbulence = 0;
    for (scale = 1; scale > twice; scale /= 2)
        turbulence += scale * noise(PP/scale);

    /* Gradual fade out of highest-frequency component near limit */
    if (scale > pixelsize) {
        weight = (scale / pixelsize) - 1;
        weight = clamp(weight, 0, 1);
        turbulence += weight * scale * noise(PP/scale);
    }

    /*
     * Magnify the upper part of the turbulence range 0.75:1
     * to fill the range 0:1 and use it as the parameter of
     * a color spline through various shades of blue.
     */
    csp = clamp(4 * turbulence - 3, 0, 1);
    Ci = color spline(csp,
    color (0.25, 0.25, 0.35),      /* pale blue        */
        color (0.25, 0.25, 0.35),  /* pale blue        */
        color (0.20, 0.20, 0.30),  /* medium blue      */
        color (0.20, 0.20, 0.30),  /* medium blue      */
        color (0.20, 0.20, 0.30),  /* medium blue      */
        color (0.25, 0.25, 0.35),  /* pale blue        */
        color (0.25, 0.25, 0.35),  /* pale blue        */
        color (0.15, 0.15, 0.26),  /* medium dark blue */
        color (0.15, 0.15, 0.26),  /* medium dark blue */
        color (0.10, 0.10, 0.20),  /* dark blue        */
        color (0.10, 0.10, 0.20),  /* dark blue        */
        color (0.25, 0.25, 0.35),  /* pale blue        */
        color (0.10, 0.10, 0.20)   /* dark blue        */
        );

    /* Multiply this color by the diffusely reflected light. */
    Ci *= Ka*ambient() + Kd*diffuse(Nf);

    /* Adjust for opacity. */
    Oi = Os;
    Ci = Ci * Oi;

    /* Add in specular highlights. */
    Ci += specularcolor * Ks * specular(Nf,V,roughness);
 }

0 komentarze:

Prześlij komentarz