Displacement Map
สร้างฉากใต้ทะเล โดยใช้ Displacement Map
Chamferbox
ขั้นตอนการสร้าง เตียง ผ้าคลุมเตียง หมอนใบนั้น
Compesite Map
ขั้นตอนการสร้างวัสดุ น้ำ Compesite Map

[Knowing Ambient Occlusion]
Amient Occlusion... คืออะไรกัน หลายคนอาจนึกคำถามนี้อยู่ในใจ ก่อนอื่นมารู้จักที่มากันก่อนครับ เนื่องจากความต้องการในการ render ภาพให้แสง เหมือนจริงจำเป็นต้องมีการคำนวณแสงสะท้อน หรือที่เรียกว่า Global Illumination ไม่ว่าจะเป็นการคำนวณแบบ Radiosity หรือการคำนวณโดยใช Photon Map ก็ใช้เวลาในการ render นานทั้งสิ้น ดังนั้นในงานจริงแล้วการ render ภาพที่มีจำนวน object สูง และ render ที่ความละเอียดสูง เช่น 2k หรือ 4k จึง เป็นเรื่องที่เสียเวลามาก ดังนั้นจึงมีการคิดหาวิธีใหม ่ที่ง่ายกว่า แต่ให้ผลอยู่ในระดับที่ยอมรับได ILM คิดวิธีนี้ขึ้นมาหลายปีแล้วครับ นั่นคือการใช Raytrace หากรวย แสงสะท้อน
ทำงานอย่างไร...
ลองดูรูปนี้ครับ

เมื่อแสงตกกระทบ Object ใดๆ จะมีการเข้าลูปเพื่อปล่อย vector ที่ใช้ในการทดสอบการชนออกมา จำนวนมาก หรือน้อยก็คือจำนวน sample ที่เราต้องตั้งค่า จุดที่แสงตกกระทบจะสว่างมากหรือน้อยขึ้นกับ สัดส่วนของ vector ที่ปล่อยออกไปแล้วชนกับ Object ใดๆ ต่อ จำนวนของ vector ที่ปล่อยออกไปทั้งหมด ถ้าไม่มีการชนเลย จุดนั้นก็จะสว่างเต็มที่แต่ถ้าชนหมดทุกตัว จุดนั้นก็จะเป็นสีดำ ดังนั้นคุณภาพของภาพที่ได ้ขึ้นอยู่กับจำนวน sample นั่นเอง ยิ่งมากก็จะยิ่ง ให้ภาพคุณภาพสูง แต่ก็หมายถึงเวลาในการคำนวน ต้องใช้มากขึ้นด้วย
การสร้าง shader ที่สามารถทำงานแบบนี้ได้ตัว render จำเป็นต้องมีความสามารถในการทำ Raytrace ซึ่งโดยทั่วไปแล้วก็ทำได้กันเกือบหมด ตัวอย่างเช่น Final Gather ของ Mentalray ความสามารถส่วหนึ่งก็เป็นการทำ ambiet occlusion ครับใครมีMentalray ก็ทดลองทำได้ง่ายๆโดยใส Shader แบบ Lambert สีขาวลงไปทุด Object ไม่ต้องใส่แสงแล้วเปิด Final Gather ใน render global ของ Mentalray เมื่อ render ออกมาก็จะเห็นเป็นภาพในรูปแบบ ambient occlusion ครับ
นอกจากนี้ก็มีplugin ที่ชื่อ DiffuseLight ของ Maya ครับ แจกฟรีทาง Internet ตัวนี้ก็ออกแบบมาเพื่อทำ ambient occlusion โดยเฉพาะ วิธีการก็ต่อ Plugin ตัวนี้เข้ากับ Incandesence ของ lambert สีขาว แล้ว render โดยไม่ต้องสร้างไฟ ก็จะได้ออกมาเช่นกันครับ ส่วน renderer หรือ plugin ตัวอื่นๆมีอีกมาก จะไม่ขอพูดถึงในที่นี้ครับ เพราะว่าเยอะมากจริงๆเช่นพวก BMRT, Brazil, Final Render ฯลฯ
วิธีอื่นๆมีมั้ย ??
เนื่องจาก การทำ Raytrace แบบนี้ต้องเสียเวลาพอสมควร โดยเฉพาะเมื่อตั้งค่า Sample ไว้มากๆเพื่อให้ได้ภาพคุณภาพสูง จึงมีการคิดวิธีอื่นๆขึ้นมาใช้กัน วิธีที่หลายคนนึกออกก็คือการสร้าง Dome Lights นั่นเอง แล้วใช Depth Map Shadow คุณภาพตํ่าและเบรอทำให้เกิดภาพที่ใกล้เคียงกับ ambient occlusion โดยการใช raytrace หรือที่Weta Studio ที่ทำเรื่อง The Lord of the Rings ก็ใช Dome Lights และ Depth Map Shadowแต่สร้าง Shader พิเศษเพื่อคำนวณให้ใกล้เคียงกับวิธีraytrace มากขึ้น แต่ใช้เวลาน้อยกว่า
มาลองทำกันดูครับโดยวิธีDome Lights

เอาล่ะ เรามีObject เป็นหุ่นยนต์ประหลาดหนึ่งตัว อยากลองทำ ambient Occlusion โดยใช Dome Lights เมื่อมีModel แล้วก็เริ่มสร้าง Shader แบบ Lambert สีขาวใส่ลงไปบน Object ทุกอย่างในฉาก

ตั้งค่า Colorให้เป็นสีขาว และ Diffuse ให้เป็น 1.0 นอกนั้นไม่ต้องครับ

Assign Shader ลงไปก็จะได้หุ่นยนต์ตัวขาวๆออกมา ทีนี้ก็เริ่มสร้างแสงเลยครับ

อันนี้ผมสร้างขึ้นมา 32 ดวงโดยใช MEL ที่ชื่อ prerenderperamid แต่ก็สร้างเองได้ครับ ใช duplicate ไปเรื่อยๆ จำนวนแสงมากก ็render ช้าครับ
ครั้งแรกผมตั้งให้แสงแต่ละดวงมีintensity 0.05 การตั้งค่าให้กับแสงหลายดวงทำได้โดย select แสงทุกดวงที่ต้องการ แล้วเปิด Window>>General Editor>>Attribute Spread Sheet ขึ้นมาครับดูที่หัวข้อ Shape Keyable ก็จะสามารถตั้งค่า Intensity ที่เดียวหมดได้โดยลากรวบทุกช่อง

ออกมาแบบนี้

ออกจะมืดเกินไปหน่อย ลองปรับแสงใหม่ครับ โดยเพิ่ม Intensity เข้าไปเป็น 0.075

render ออกมาใหม่ก็สว่างขึ้นครับ

สังเกตจะเห็นเป็นรอยจํ้าๆบนพื้น เป็นรอยซึ่งเกิดจากการตัดกันไปมาของ Depth Map Shadow นั่นเองครับคุณภาพที่ออกมาก็ถือว่าใช้ได้ในระดับหนึ่ง ซึ่งถ้า เทียบก็เวลาที่ใช้ในการ render ซึ่งเร็วมาก (ไม่ถึงนาที) ก็นับว่าคุ้มครับ
Pixar's RenderMan 11.0
ทีนี้ลองมาดูวิธีRaytrace กันบ้าง ผมจะยกตัวอย่างการใช RAT 5.5 กับ PRMan 11.0 ครับ เนื่องจากเป็นความสามารถที่เพิ่งจะเพิ่มเข้ามาของ PRMan เลยเอามาให้ลองใช้กันดู
เริ่มจากเปิด Slim ซึ่งคล้ายกับ HyperShade ของ Maya ขึ้นมาครับ สร้าง appearence ที่ชื่อ SwissArmy ขึ้นมา

ได้แล้วก ็double click ขึ้นมาตั้งค่าให Surface Color เป็นสีขาว Ambient Strength เป็น 0 Specular Strength เป็น 0

สกอร์ลงมาด้านล่างจะเห็นคำว่า Indirect Diffuse ครับคลิกค้างที่กล่องเหลือง แล้วเลือก Connection

จากนั้นคลิกที่ปุ่มด้านขวาและเลือก more>>IndirectIllum

จะได้แบบนี้ออกมาครับ วิธีการนี้เป็นวิธีการเบื้องต้นในการ เชื่อมต่อ Node ต่างๆเข้าด้วยกัน คล้ายๆกับ HyperShade ของ Maya นั่นเอง ทีนี้คลิกปุ่มที่ชื่อ IndirectIllum_0

เราจะเข้ามาที่หน้าจอของ IndirectIllum_0 ซึ่งมีการตั้งค่าหลายอย่างเกี่ยวกับการทำ Indirect Illumination เอาติ๊กที่ช่อง Color Bleeding ออกครับ ในที่นี้เราไม่ต้องใช้ความสามารถในการทำ Color Bleeding หรือการถ่ายทอดสีไปให object ใกล้เคียง ซึ่งจะทำให render เร็วขึ้นด้วย

จากนั้นตั้งค่า Samples ให้เป็น 256 ตรงนี้ต้องระวังนิดนึงครับ ยิ่งเยอะก็ยิ่งนานนน มาก แต่ก็จะได้คุณภาพดี

เรียบร้อยก็ทำการ attach ลงไป Object ที่ต้องการ โดย Select Object ทั้งหมดแล้วคลิกขวาที่SwissArmy ใน Slim แล้วเลือก Attach แค่นี้ก็เรียบร้อย

มาดูRender Global ของ PRMan กันบ้างว่ามีอะไรให้ตั้งค่าบ้างที่แน่ๆ ในหัวข้อ Rays ต้องติ๊ก Enable Ray Tracing เพื่อสั่งใน PRMan คำนวณ Raytrace ด้วย

ดูที่หัวข้อ Irradiance Cache ตั้งค่า Max Error และ Max Pixel Distance เป็น 0.1 ค่านี้ยิ่งน้อยยิ่งทำให้การคำนวน Indirect Illumination คุณภาพสูง ครับ แต่ก็จะ render นานมาก ถ้าค่าเป็น 0 ก็จะให้คุณภาพสูงสุด

เปิดไปที่หัวข้อ Reyes ครับตรงนี้เราจะตั้งค่า Shading Rate ซึ่งเป็นคุณภาพโดยรวมของ PRMan ค่าที่ให้คุณภาพสูง จะเริ่มจาก 1 ลงมาเรื่อยๆ ยิ่งน้อยยื่ง คุณภาพดีในที่นี้ก็ตั้งเอาไว 0.2 เป็นโดยทั่วไปครับ

เอาล่ะจัดแจงปรับมุมกล้องใหม่นิดหน่อย สั่ง render แล้วไปนอนรอได้เลย

เนื่องจาก render นานนนมากๆ ผมเลยลด sample เหลือ 128 และ ตั้งค่า Max Error และ Max Pixel Distance เป็น 0.2 ก็เลยออกมาเป็นจํ้าๆเยอะแยะ อย่างที่เห็นครับ

เสร็จแล้วก ็render เพิ่มอีกซัก 2 pass มีflat color pass และ lighting pass ง่ายๆพอให้เห็นภาพครับ

นำมาซ้อนกันไปมาปรับสีนิดหน่อยใน Shake ก็จะได้ภาพด้านล่างออกมา...

ต่ออีกหน่อย...

render hilight pass ออกมาอีกอันครับ แล้วก็ไปเพิ่มใน shake ตามเคย

คราวนี้ใช IAdd และปรับความสว่างด้วย ColorCorrect

ได hilight หรือ specular ติดมาด้วย ถ้าอยากให้มีรายละเอียดมากกว่านี้ก็จะมีอีกหลาย pass ครับ ภาพนี้เป็นตัวอย่างง่ายๆ กับการใช้แสงเพียงดวงเดียว
Ambient Occlusion เป็นวิธีดีครับ ในการ render เพิ่มความสมจริงให้ภาพ ไม่ทำให้ภาพแบน และก็ใช้เวลาน้อยกว่าการ render ด้วย global Illumination เต็มรูปแบบอีกด้วย PRMan 11.0 render ช้ามากๆเลยทีเดียว (เป็นชั่วโมง) จึงไม่ควรใช้ถ้าไม่เห็นผลชัดเจนและต้องการภาพแบบนี้จริงๆ มีวิธีที่render เร็ว กว่านี้ครับ แต่ต้องเขียน shader เอง ถ้ามีโอกาศจะนำมาเขียนให้อ่านกันครับ เช่นเคย มีข้อสงสัยหรือข้อติชมอะไร email หรือเข้ามาแปะคำถามไว้ที่webboard ได้ครับ

<<Back