Rendering学習日記

日々3DCGの世界は進歩しているけど、勉強して理解したことをまとめていきたい。RenderMan互換レンダラーやグローバル・イルミネーション。いろんなことに好奇心を持ち面白くなってくる。目指せShader書き!!

<< Lightflow C API sample lights | main | Lightflow C API sample ocean >>

Lightflow C API sample cloud

main5.cpp
#includeの両側に半角スペースが入っています。


#include < Lightflow/LfLocalSceneProxy.h >

void main()
{
LfLocalSceneProxy* s = new LfLocalSceneProxy();
LfArgList list;

list.Reset();
list << "direction" << LfVector3( 8.0, 5.0, -6.0 );
list << "color" << LfColor( 1.0, 1.0, 1.0 );
s->LightOn( s->NewLight( "directional", list ) );


list.Reset();
list << "value"
<< 0.3 << 1.0 << 1.0
<< 0.5 << 0.0 << 0.0;
list << "scale" << 1.0;
list << "turbulence.omega" << 0.55;
list << "turbulence.lambda" << 1.8;
list << "turbulence.octaves" << LfInt( 6 );
LfInt cloudpattern1 = s->NewPattern( "granite", list );

// Make a granite-like volumetric pattern.
// Note the keyword "value", followed by two rows of three parameters
// each.
// This is an example of value-gradient. A gradient is a function which
// interpolates many values, which may be numbers, colors, or entire
// patterns and materials.
// By convention numeric gradients are called value-gradients, color ones
// are named color-gradients and so on.
// As a function a gradient associates a value to a real variable.
// You can imagine it in cartesian coordinates, putting the variable on
// the abscissas and the associated value on the ordinates.
// Here the first expected argument is the abscissa at which the value
// of the function is specified, then the value follows. The value is
// specified both at the right and at the left of the abscissa in order
// to model discontinuities, so it is composed by two numbers.
// You can specify how many abscissas (and values) you want.
// This gradient is used to model the output of our fractal pattern,
// that we will use to describe the spatial density of the cloud.
// Here the gradient smoothly blends from the value of 1 at the point 0.3,
// to the value of 0 at the point 0.5.
// Normally the output would be a value between 0 and 1, but we
// make it droppoff rapidly from 1 to 0 to model masses of clouds that
// are denser at their center and that disappear at their boundaries.

list.Reset();
list << "value"
<< 0.8 << 1.0 << 1.0
<< 1.0 << 0.0 << 0.0;
list << "scale" << 1.2;
LfInt cloudpattern2 = s->NewPattern( "radial", list );

// Make a radial pattern, that is to say a spherical figure that is
// dense at its center and that has zero density at its border.
// This sphere has a radius of 1.2.

list.Reset();
list << "patterns" << cloudpattern1 << cloudpattern2;
LfInt cloudpattern = s->NewPattern( "compose", list );

// Compose the two patterns. Here the output of cloudpattern1 is used
// as the input of cloudpattern2. Since the radial pattern uses its
// input to scale its output, the result will be a sphere containing a
// granitic texture which diminishes its intensity near the border.

list.Reset();
list << "kr" << LfColor( 0.7, 0.85, 1.0 );
list << "kaf" << LfColor( 0.2, 0.35, 0.5 );
list << "density" << 1.0;
list << "density" << cloudpattern;
list << "sampling" << 20.0;
list << "shadow-caching" << LfPoint( -1.2, -1.2, -1.2 ) << LfPoint( 1.2, 1.2, 1.2 );
list << "density-caching" << LfInt( 2048 ) << LfPoint( -1.2, -1.2, -1.2 ) << LfPoint( 1.2, 1.2, 1.2 );
LfInt cloudinterior = s->NewInterior( "cloud", list );

// Here you should note how we described density.
// It has been specified with a single value of 1 and then with the
// pattern we modeled before. The value of 1 will be used as a input to
// cloudpattern1, which will scale its output by this factor. In
// this case there will be no scaling, and the output will go from 1 to
// 0, as we stated above.
// The "shadow-caching" and "density-caching" attributes specify the use of
// two different caching mechanisms that will be used to speed-up
// computations. They both require a bounding box where to work, and
// the density cache also requires the maximum allowed memory
// occupancy, which is expressed in Kb (here 2048, i.e. 2 Mb).
// The "sampling" value specifies how many samples will be taken into a
// segment long one.

s->InteriorBegin( cloudinterior );

list.Reset();
LfInt cloud = s->NewMaterial( "transparent", list );

s->InteriorEnd();


s->MaterialBegin( cloud );

list.Reset();
list << "radius" << 1.2;
s->AddObject( s->NewObject( "sphere", list ) );

s->MaterialEnd();


list.Reset();
list << "file" << "cloud.tga";
LfInt saver = s->NewImager( "tga-saver", list );

s->ImagerBegin( saver );

list.Reset();
list << "eye" << LfPoint( 0, -4, 0 );
list << "aim" << LfPoint( 0, 0, 0 );
LfInt camera = s->NewCamera( "pinhole", list );

s->ImagerEnd();

s->Render( camera, 300, 300 );

delete s;
}


$ /usr/local/gcc-2.95/bin/g++ -I ./include -lLightflow main5.cpp -o simplescene5
$ ./simplescene5
$ convert cloud.tga cloud.jpg
$ eog cloud.jpg
cloud.jpg
Lightflow | - | -