Relief Texture Mapping

Download Report

Transcript Relief Texture Mapping

418382 สภาพแวดล้อมการทางานคอมพิวเตอร์กราฟิ กส์
การบรรยายครั้งที่ 13
ประมุข ขันเงิน
[email protected]
วัตถุจริ งๆ ตามธรรมชาติ
• ขรุขระ
วัตถุจริ งๆ ตามธรรมชาติ
• ขรุขระ
วัตถุจริ งๆ ตามธรรมชาติ
• ขรุขระ
วัตถุที่เราสร้างได้ดว้ ย OpenGL
• เรี ยบ
Texture Mapping
• เราสามารถใช้ texture เพิ่มรายละเอียดให้ วตั ถุได้
• แต่นนั่ ก็เป็ นแค่การเปลี่ยนสี ไม่มีลกั ษณะความขรุขระหรือตื ้นลึก
ภาพจาก Oliveira, Bishop, McAllister, Relief Texture Mapping
การทาให้พ้นื ผิวดูขรุ ขระ
1.
2.
3.
4.
Displacement Mapping
Normal Mapping
Bump Mapping
Relief Mapping
Displacement Mapping
•
•
•
•
•
Cook (1984)
เริ่มต้ นจากพื ้นผิวเรี ยบที่สร้ างจาก polygon จานวนมาก
texture แสดงความ “นูน” ของพื ้นผิว
ใช้ texture ในการยกหรื อกด vertex บนพื ้นผิวนัน้
ผลลัพธ์ได้ เป็ นพื ้นผิวขรุขระจริงๆ
Displacement Mapping
Displacement Mapping
• ข้ อดี
– ได้ ภาพที่สมจริงจริงๆ
• ข้ อเสีย
– ต้ องใช้ polygon จานวนมากเพื่อสร้ างรายละเอียด
– เปลืองหน่วยความจา
– วาดช้ า
Normal Mapping
• จาลองความขรุขระโดยใช้ texture ระบุ normal ของแต่ละ
fragment เอาเอง
• มี texture เพิ่มมาหนึง่ อันใช้ เก็บ normal
• เวลาคานวณ normal ให้ นา normal จาก texture มาใช้
– ไม่ได้ เอา normal ตามที่ OpenGL ให้ มา
• นิยมใช้ ตามซอฟต์แวร์ สร้ าง content สามมิตติ า่ งๆ
– 3ds Max, Maya, Blender, ฯลฯ
Normal Mapping
• การเก็บ normal ในรูปภาพ
– ใช้ R แทนค่า x
– ใช้ G แทนค่า y
– ใช้ B แทนค่า z
• ความจริง normal จะเป็ นเวกเตอร์ หนึง่ หน่วย
– ดังนัน้ z = sqrt(1 – x2 – y2)
– ฉะนันเก็
้ บแค่ x และ y ก็ได้
Normal Mapping
• x, y, และ z จะมีคา่ ได้ ตงแต่
ั ้ -1 ถึง 1
• แต่ R, G, และ B มีคา่ ได้ ตงแต่
ั ้ 0 ถึง 1 เท่านัน้
• เพราะฉะนันต้
้ องแทน
– -1 ด้ วย 0
– 1 ด้ วย 1
• กล่าวคือ R = x/2 + 0.5
• สีของ normal map จึงดูสว่างๆ
Normal Mapping
• ตัวอย่าง normal map
จาก http://www.bencloward.com/
จาก http://planetpixelemporium.com/
Normal Map ทาให้เกิดความขรุ ขระได้อย่างไร?
• ใน Phong lighting model เราใช้ normal ในการคานวณ
– สี diffuse
– สี specular
• เราไม่ได้ ใช้ ตาแหน่งของ fragment โดยตรงในการคานวณสี
– เว้ นแต่ตอนที่หาเวกเตอร์ จากตาไปยัง fragment
• พื ้นผิวขรุขระ  ความสูงเปลี่ยนเร็ว  normal เปลี่ยนเร็ ว
• ใช้ normal map เก็บ normal ไว้  สามารถหาสีได้
เหมือนกับพื ้นผิวขรุขระ โดยไม่ต้องเก็บพื ้นผิว
Normal Mapping
• โมเดลที่ทาจาก polygon เรี ยบๆ ไม่กี่ polygon
จาก http://www.bencloward.com/
Normal Mapping
• เพิ่ม normal map
จาก http://www.bencloward.com/
Normal Mapping
• ภาพที่มีรายละเอียดสูง
จาก http://www.bencloward.com/
Normal Mapping
Normal Mapping
http://amber.rc.arizona.edu/lw/normalmaps.html
Normal Mapping
http://amber.rc.arizona.edu/lw/normalmaps.html
เราจะสร้าง normal map อย่างไร?
• มีสองวิธี
– สร้ างจากโมเดลรายละเอียดสูง
• ไปดึงเอา normal ณ จากตาแหน่งต่างๆ มาเก็บไว้ ใน texture
• ซอฟต์แวร์ สร้ างเนื ้อหาสามมิติส่วนใหญ่มี feature ให้ คณ
ุ สามารถสร้ าง normal
map ได้
– คานวณจาก bump map
Bump Mapping
• วิธีการสร้ างความขรุขระโดยใช้ texture ที่กาหนด “ความสูง” ของ
พื ้นผิว
– Texture แบบเดียวกับที่ใช้ ทา displacement mapping
• ต้ องการได้ normal สาหรับแต่ละ fragment เหมือน normal
map
– Normal map  ผู้ใช้ กาหนด normal ให้
– Bump map  คานวณเองจากความสูง
Surface Parameterization
• ก่อนทา bump mapping ได้ เราจะต้ องสามารถระบุจดุ แต่ละจุด
บนพื ้นผิวได้ ด้วยพิกดั (u,v)
• ยกตัวอย่างเช่น ถ้ าเป็ นพื ้นผิวสี่เหลี่ยมธรรมดา เราอาจจะกาหนดพิกดั
(u,v) ดังต่อไปนี ้
(1,1)
(0,0)
Surface Parameterization
• ในกรณีที่เป็ นพื ้นผิวอื่นๆ surface parameterization คือ
ฟั งก์ชนั p : R2 ! R3
• ฟั งก์ชนั นี ้จะรับพิกดั (u,v) แล้ วคืนจุด (x,y,z) ในสามมิตมิ าให้
• สมมติวา่ พื ้นผิวสี่เหลี่ยมจัตรุ ัสในข้ อที่แล้ วมี
– มุมล่างซ้ ายที่จดุ (-1,-1,0) และ
– มุมบนขวาที่จดุ (1,1,0) แล้ ว
เราจะได้ วา่
2
3
2u ¡ 1
p(u; v) = 4 2v ¡ 15
0
Surface Parameterization
• สาหรับทรงกลม เราอาจจะใช้
spherical coordinate
2
3
cosÁsin µ
p(µ; Á) = 4 sin Ásin µ5
cosµ
• แต่ปกติแล้ ว u และ v จะมีคา่ ตังแต่
้
0 ถึง 1 ฉะนันเราจะใช้
้
2
3
cos(2¼v) sin(¼u)
p(u; v) = 4 sin(2¼v) sin(¼u) 5
cos(¼u)
Surface Parameterization
• ถ้ าเป็ นโดนัทที่มีรัศมีหลอดเท่ากับ r
และรัศมีของวงกลมใหญ่เท่ากับ R
เราอาจใช้
2
3
(R + r cos(2¼v)) cos(2¼u)
p(u; v) = 4 (R + r cos(2¼v)) sin(2¼u) 5
r sin(2¼v)
Bump Map
• Bump map เป็ นฟั งก์ชนั d : R2 ! R โดยที่ d(u; v) มีคา่ เท่ากับ
ระยะทางที่พื ้นผิว ณ พิกดั (u,v) ถูกทาให้ สงู ขึ ้นหรื อต่าลงตามแนวของ
normal ที่จดุ นัน้
• ฉะนันพื
้ ้นผิวใหม่ที่ได้ คือ
p ¤ (u; v) = p(u; v) + d(u; v)n(u; v)
โดยที่ n(u; v) คือ normal ที่พื ้นผิวพิกดั (u,v)
Bump Map
การคานวณ Normal
• เราต้ องการคานวณ normal ของพื ้นผิวใหม่ p*
• ปกติแล้ วเขาจะคานวณ normal กันอย่างไร?
• ถ้ าเรามีฟังก์ชนั p ของพื ้นผิวใดๆ เราจะได้ วา่
เมื่อ
@p
@u
@p
@v
µ
¶
@p
@p
n(u; v) = normalize
£
@u
@v
คือ partial derivative ของ p เมื่อเทียบกับ u
คือ partial derivative ของ p เมื่อเทียบกับ v
normalize คือการทาให้ เป็ น vector หนึง่ หน่วย
ตัวอย่าง
• สาหรับฟั งก์ชนั p ของรูปสี่เหลี่ยม
3
2u ¡ 1
p(u; v) = 4 2v ¡ 15
0
• เราจะได้ วา่
2
2 3
2 3
2
0
@p
@
p
= 4 05 ;
= 4 25
@u
@v
0
0
2 3
µ
¶
0
@p
@p
n(u; v) = normalize
£
= 4 05
@u
@v
1
การคานวณ Normal ของ p*
• เราได้ วา่
µ ¤
¶
¤
@p
@p
¤
n (u; v) = normalize
£
@u
@v
• เพื่อความง่าย เราจะคานวณ
¤
¤
@
p
@
p
m¤ =
£
@u
@v
ก่อน
• m* เป็ นเวกเตอร์ ที่ตงฉากกั
ั้
บพื ้นผิว แต่มนั ไม่ใช่เวกเตอร์ หนึง่ หน่วย
การคานวณ Normal ของ p*
• เราจะได้ อีกว่า
@p ¤
@(p + dn)
=
=
@u
@u
@p
@d
=
+
n+
@u @u
@p
@(dn)
+
@u
@u
@n
d
@u
• ในทานองเดียวกัน
@p ¤
@p @d
@n
=
+
n+
d
@v
@v @v
@v
การคานวณ Normal ของ p*
• เพื่อให้ การคานวณง่ายขึ ้น เราจะประมาณว่า
@p ¤
@p
@d
¼
+
n
@u
@u
@u
@p ¤
@p
@d
¼
+
n
@v
@v
@v
@n
n
• ทังนี
้ ้เป็ นเพราะว่า @
และ
้ านวณลาบาก
@v นันค
@u
• การตัดเทอมสุดท้ ายออกยังค่อนข้ างสมเหตุสมผล เนื่องจาก
– d(u,v) มีคา่ น้ อย (ถ้ ามีคา่ มากเกินไปก็ควรจะทาสร้ างโมเดลใหม่เสีย)
@n
n
– พื ้นผิวตังต้
้ นเป็ นพื ้นผิวเรี ยบ ดังนัน้ @
และ
่ น้ อย
@v จึงมีคา
@u
(กล่าวคือ normal ไม่เปลี่ยนแปลงอย่างรวดเร็ว)
การคานวณ Normal ของ p*
• ฉะนัน้
µ
¶
µ
@p
@d
@p
m ¼
+
n £
+
@u @u
@v
µ
¶ µ
@p
@p
@d
=
£
+
n£
@u
@v
@u
¤
• แล้ ว
¶
@d
n
@v
¶ µ
¶
@p
@d
@p
¡
n£
@v
@v
@u
¤
m
n ¤ = normalize(m ¤ ) =
km ¤ k
การคานวณ Normal ของ p*
•
•
•
•
ที่เหลือคือต้ องคานวณ
และ
ถ้ ามีสตู รของ d เราสามารถทาการคานวณมันได้ อย่างง่ายดาย
แต่ปกติแล้ ว d จะให้ มาเป็ น texture
อย่างไรก็ดี เราสามารถประมาณอนุพนั ธ์ได้ ดงั ต่อไปนี ้
@d
@u
@d
@v
¯
0
0
0 0
@d ¯
d(u
+
"
;
v
)
¡
d(u
;v )
¯
¼
@u ¯( u 0;v 0)
"
¯
0 0
0 0
@d ¯
d(u
;
v
+
"
)
¡
d(u
;v )
¯
¼
@u ¯ 0 0
"
( u ;v )
โดยที่  คือค่าคงที่ที่มีคา่ น้ อยค่าหนึง่
การคานวณ Normal ของ p*
• ในภาษา Cg เราจะให้ d เป็ นตัวแปรประเภท sampler2D
• สมมติวา่ d เป็ น texture ที่มีความกว้ าง w pixel และสูง h
pixel
• เราสามารถคานวณ partial derivative ของ d ณ พิกดั (u,v)
ได้ ดงั ต่อไปนี ้
float dddu =
tex2D(d,
float dddv =
tex2D(d,
w*(tex2D(d, float2(u+1.0f/w,v)) –
float2(u,v))).r;
h*(tex2D(d, float2(u,v+1.0f/h)) –
float2(u,v))).r;
Normal Mapping
ข้อจากัดของ Normal และ Bump Mapping
• ไม่มีการทอดเงาลงบนตัวเอง
• ไม่มี parallax
– ส่วนที่นนู ขึ ้นมาเคลื่อนที่ไปพร้ อมกับส่วนที่เว้ าลงไป
– ความจริงแล้ วทังสองส่
้
วนนี ้ควรจะเคลื่อนที่เมื่อเทียบกับตาแตกต่างกัน
เล็กน้ อย
Relief Mapping
• เทคนิคการแสดงผลพื ้นผิวที่มีรายละเอียดสูงโดยใช้ ข้อมูลความสูงของ
fragment แต่ละ fragment ประกอบ
• คิดว่าจริงๆ แล้ วพื ้นผิวเป็ น “กล่อง”
ภาพจาก Oliveira, Bishop, McAllister, Relief Texture Mapping
Relief Mapping
ภาพจาก Oliveira, Bishop, McAllister, Relief Texture Mapping
Relief Mapping
Policarpo, Oliveira, Comba. Real-Time Relief Mapping on Arbitrary Polygonal Surfaces
Relief Map
• สาหรับพื ้นผิวที่ต้องการแสดง จะมี texture อยู่ 2 texture
– Normal map
– Height map บอกความ “ลึก” ของแต่ละ texel
• 0 = ตื ้น, 1 = ลึก
• สามารถแทนทังหมดข้
้
างบนนี ้ได้ ด้วย texture RGBA แค่
texture เดียว
– Normal map  RGB
– Height map  A
Relief Map
Policarpo, Oliveira, Comba. Real-Time Relief Mapping on Arbitrary Polygonal Surfaces
การแสดงผล Relief Map
• วาดพื ้นผิวเรี ยบที่มี relief map ที่ติดอยูด่ ้ วยตามธรรมดา
• เมื่อไปถึงขันของการประมวลผล
้
fragment เราจะมีข้อมูล
– ตาแหน่งของ fragment
– Texture coordinate
• คิดว่า fragment อยูท่ ี่ “ผิวหน้ า” ของกล่อง
• ลากรังสีจากสายตาไปยัง fragment
• เราต้ องการหาว่ารังสีนนตั
ั ้ ดกับพื ้นผิวจริงๆ ที่ไหน
การแสดงผล Relief Map
• ตาแหน่ง A = ตาแหน่งของ fragment
• ต้ องการหาจุด (3) ซึง่ เป็ นจุดแรกที่รังสีตดั กับพื ้นผิว
การแสดงผล Relief Map
• เราสามารถจุดที่รังสีตดั กับวัตถุเป็ นจุดแรกได้ ด้วยการทา binary
search
– คานวณจุด B ซึง่ เป็ นจุดที่รังสีเดินทางถึงความลึก 1
– คานวณจุดตรงกลางระหว่าง A กับ B (ในภาพคือจุด (1))
– ถ้ าจุดตรงกลางนันอยู
้ ใ่ ต้ พื ้นผิว
• เปลี่ยน B ไปเป็ นจุด (1)
– ถ้ าจุดตรงกลางอยูเ่ หนือพื ้นผิว
• เปลี่ยน A ไปอยู่ที่จดุ (1)
– ทาเช่นนี ้ไปเรื่ อยๆ จน A กับ B ใกล้ กนั มากๆ (ส่วนใหญ่ 8 รอบก็พอ)
– ใช้ normal และสีที่จดุ กลางระหว่าง A กับ B ในการแสดงผล
การแสดงผล Relief Map
• อย่างไรก็ดีการหาจุดดังกล่าวอาจทาให้ เราเห็นพื ้นผิวที่ถกู บังได้
• กรณีที่มีพื ้นผิวแคบๆ ระหว่างจุด A กับ (1)
การแสดงผล Relief Map
• เพื่อหลีกเลี่ยงความผิดพลาดดังกล่าว เราจะทดสอบจุดที่อยูห่ ่างจากจุด
A ไปทีละ  จนกระทัง่ เจอพื ้นผิวแรก
• หลังจากนันใช้
้ binary search
การแสดงผล Relief Map
• เราสามารถนาอัลกอริทมึ เดียวกันไปใช้ หาว่าจุดที่เห็นได้ รับแสงหรื อไม่
ด้ วย
• ทาการลากเส้ นจากจุดบนพื ้นผิวไปยังแหล่งกาเนิดแดง
• หาว่ามีพื ้นผิวระหว่างจุดตัดกับแหล่งกาเนิดแสดงหรื อไม่
Relief Mapping
Policarpo, Oliveira, Comba. Real-Time Relief Mapping on Arbitrary Polygonal Surfaces
Relief Mapping
Policarpo, Oliveira, Comba. Real-Time Relief Mapping on Arbitrary Polygonal Surfaces
Relief Mapping
Relief Mapping
ข้อจากัดของ Relief Mapping
• ไม่สามารถทาให้ เงาของวัตถุขรุขระตามไปด้ วยได้