天天看點

Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明

标題中的“PT”表示:Procedural Texture(過程紋理)。表示該章節屬于“過程紋理”的内容。

目前章節在“過程紋理”内容中的位置:

過程紋理(0)——概述

過程紋理(1)——方格紋理(1)——3D方格紋理

過程紋理(1)——方格紋理(2)——2D方格紋理(1)——平面2D方格紋理

過程紋理(1)——方格紋理(2)——2D方格紋理(2)——球面2D方格紋理

過程紋理(1)——方格紋理(2)——2D方格紋理(3)——圓柱2D方格紋理

過程紋理(2)——紋理的仿射變換

過程紋理(3)——基于噪聲的紋理(0)——概述

過程紋理(3)——基于噪聲的紋理(1)——Basic Noise Texture

過程紋理(3)——基于噪聲的紋理(2)——Wrapped Noise Texture

過程紋理(3)——基于噪聲的紋理(3)——Marble

過程紋理(3)——基于噪聲的紋理(4)——Sandstone Texture

過程紋理(3)——基于噪聲的紋理(5)——Wood Texture

0,引言

該章節的内容理論參考:

《Advanced RenderMan》2000版本的12.4章節”Wood Grain”。

代碼來自與《Ray Tracing from the Ground Up》作者按照《Advanced RenderMan》算法整理的C++代碼。

本章節的内容,主要是個人對上面這兩部分知識的了解和測試。

1,Wood類的基本版本

Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明
Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明
Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明
Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明

測試代碼:

#define TYPE 
// TYPE = 0: (0,1,0)
// TYPE = 1: (0,0,1)

void
World::build(void) {
    int num_samples = ;

    vp.set_hres();
    vp.set_vres();
    vp.set_samples(num_samples);

    tracer_ptr = new RayCast(this);
    background_color = black;

    Ambient* ambient_ptr = new Ambient;
    ambient_ptr->scale_radiance();
    set_ambient_light(ambient_ptr);


    Pinhole* pinhole_ptr = new Pinhole;
#if TYPE == 
    pinhole_ptr->set_eye(, , );
#else
    pinhole_ptr->set_eye(, , );
#endif // TYPE
    pinhole_ptr->set_lookat();
    pinhole_ptr->set_view_distance();
    pinhole_ptr->compute_uvw();
    set_camera(pinhole_ptr);


    Directional* light_ptr = new Directional;
#if TYPE == 
    light_ptr->set_direction(, , );
#else
    light_ptr->set_direction(, , );
#endif // TYPE
    light_ptr->scale_radiance();
    add_light(light_ptr);


    // wood texture

    // This Wood constructor just specifies the light and dark colors.
    // The other parameters are defaults.

    RGBColor light_color(, , );
    RGBColor dark_color();

    Wood* wood_ptr = new Wood(light_color, dark_color);
    wood_ptr->set_grainy();
    wood_ptr->set_ringy();

    InstanceTexture* transformed_wood_ptr = new InstanceTexture(wood_ptr);
    transformed_wood_ptr->scale();
//  transformed_wood_ptr->rotate_x(5); // for figure 3


    // material

    SV_Matte* sv_matte_ptr = new SV_Matte;
    sv_matte_ptr->set_ka();
    sv_matte_ptr->set_kd();
    sv_matte_ptr->set_cd(transformed_wood_ptr);


    // plane

    Point3D p0(, , );

#if TYPE == 
    Plane* plane_ptr = new Plane(p0, Normal(, , ));
#else
    Plane* plane_ptr = new Plane(p0, Normal(, , ));
#endif // TYPE
    plane_ptr->set_material(sv_matte_ptr);
    add_object(plane_ptr);
}
           

輸出圖形:

(前邊的是從+y方向向原點看的圖形;後邊的是從+z方向向原點看的圖形)

Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明
Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明

2,添加各種噪聲

2.1 第一步:添加“整體噪聲”

Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明

輸出圖形:

(前邊的是從+y方向向原點看的圖形;後邊的是從+z方向向原點看的圖形)

Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明
Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明

2.2 第二步:給樹幹添加噪聲

Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明

輸出圖形:

(前邊的是從+y方向向原點看的圖形;後邊的是從+z方向向原點看的圖形)

Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明
Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明

2.3 第三步:給年輪加“角度噪聲”

Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明

輸出圖形:

(前邊的是從+y方向向原點看的圖形;後邊的是從+z方向向原點看的圖形)

Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明
Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明

2.4 第四步:給年輪的半徑加噪聲

Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明
Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明

輸出圖形:

(前邊的是從+y方向向原點看的圖形;後邊的是從+z方向向原點看的圖形)

Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明
Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明

(這種狀态的木紋紋理,遠看還OK,但是近看則顯得有失真實)

2.5 第五步:加産生“細碎紋理”的噪聲

Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明
Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明

輸出圖形:

(前邊的是從+y方向向原點看的圖形;後邊的是從+z方向向原點看的圖形)

Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明
Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明

(從這個圖形中可以看出前面提到的“細長細長的細碎紋理”)

3,其他測試圖形

3.1 測試代碼

void
World::build(void) {
    int num_samples = ;
    vp.set_hres();
    vp.set_vres();
    vp.set_samples(num_samples);
    vp.set_gamut_display(true);

    background_color = RGBColor();
    tracer_ptr = new RayCast(this);

    Pinhole* pinhole_ptr = new Pinhole;

    pinhole_ptr->set_eye(, , ); // sphere: (0, 0, 100)
    pinhole_ptr->set_lookat();
    pinhole_ptr->set_view_distance();
    pinhole_ptr->compute_uvw();
    set_camera(pinhole_ptr);


    PointLight* light_ptr = new PointLight;
    light_ptr->set_location(, , );
    light_ptr->scale_radiance();
    add_light(light_ptr);


    // wood texture

    // This Wood constructor just specifies the light and dark colors.
    // The other parameters are defaults.

    RGBColor light_color(, , );
    RGBColor dark_color();

    Wood* wood_ptr = new Wood(light_color, dark_color);
    wood_ptr->set_grainy();
    wood_ptr->set_ringy();

    InstanceTexture* transformed_wood_ptr = new InstanceTexture(wood_ptr);
    transformed_wood_ptr->scale();
//  transformed_wood_ptr->rotate_z(110);


    // material:

    SV_Matte* sv_matte_ptr = new SV_Matte;
    sv_matte_ptr->set_ka();
    sv_matte_ptr->set_kd();
    sv_matte_ptr->set_cd(transformed_wood_ptr);

    // the sphere:

//  Sphere* sphere_ptr = new Sphere();
    SolidCylinder* sphere_ptr = new SolidCylinder();

    Instance* instance_ptr = new Instance(sphere_ptr);
    instance_ptr->scale();
//  instance_ptr->rotate_x(-60);
//  instance_ptr->rotate_y(-30);
    instance_ptr->set_material(sv_matte_ptr);
    add_object(instance_ptr);
}
           

3.2 輸出圖形

給球面添加木紋:

Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明

給圓柱添加木紋:

Q96:PT(3.5):木紋紋理(Wood Texture)0,引言1,Wood類的基本版本2,添加各種噪聲3,其他測試圖形4,其他說明

4,其他說明

完整代碼下載下傳路徑:http://download.csdn.net/detail/libing_zeng/9800234

Referrance:

[1]. Kevin Suffern, Ray Tracing from theGround Up, A K PetersLtd, 2007.

[2]. Anthony A. Apodaca, Larry Gritz, Advanced RenderMan, Academic Press, 2000.

繼續閱讀