标題中的“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類的基本版本
測試代碼:
#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方向向原點看的圖形)
2,添加各種噪聲
2.1 第一步:添加“整體噪聲”
輸出圖形:
(前邊的是從+y方向向原點看的圖形;後邊的是從+z方向向原點看的圖形)
2.2 第二步:給樹幹添加噪聲
輸出圖形:
(前邊的是從+y方向向原點看的圖形;後邊的是從+z方向向原點看的圖形)
2.3 第三步:給年輪加“角度噪聲”
輸出圖形:
(前邊的是從+y方向向原點看的圖形;後邊的是從+z方向向原點看的圖形)
2.4 第四步:給年輪的半徑加噪聲
輸出圖形:
(前邊的是從+y方向向原點看的圖形;後邊的是從+z方向向原點看的圖形)
(這種狀态的木紋紋理,遠看還OK,但是近看則顯得有失真實)
2.5 第五步:加産生“細碎紋理”的噪聲
輸出圖形:
(前邊的是從+y方向向原點看的圖形;後邊的是從+z方向向原點看的圖形)
(從這個圖形中可以看出前面提到的“細長細長的細碎紋理”)
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 輸出圖形
給球面添加木紋:
給圓柱添加木紋:
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.