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

[Introduction to Shading Language Part 2]

คราวที่แล้ว เราได้พูดกันถึงเรื่องพื้นฐานของการใช้งาน shading Language ไปแล้ว ลองมาประยุกต์ใช้งานกันดูครับ...

ภาพลูกตาด้านบนนี้คือจุดหมายของเราในตอนนี้ เนื่องจากลูกตาเป็นส่วนประกอบที่สำคัญ ของตัวละครเกือบทุกตัวหลายๆคนคงเคยพยายามทำหลายๆวิธีมาแล้ว ลองมาดูวิธีนี้อีกอัน
เป็นตัวอย่างครับ
เริ่มจาก ภาพม่านตา ตรงนี้คงต้องขอข้ามในเรื่องของรายละเอียดปครับ เนื่องจากจะค่อยข้างยาว ลองดูขั้นตอนคร่าวๆครับ

จากภาพถ่าย close up ของลูกตา ลองเลียนแบบลักษณะการวางเส้นของม่านตาดูครับ
ภาพล่างนี้เกิดจากการใช้คำสั่ง filter>>render>>clouds
จากนั้น filter>>distort>>radial blur
ปรับสีโดยใช้ image>>adjust>> hue/satuation, level, curve, brightness/contrast

layer ก็ออกมาแบบนี้ครับ ลองทำตาม ไม่ยากอย่างที่คิด :)
ก่อนนำไปใช้งานก็ต้องใช้ filter>>distort>>polar coordinates ก่อนครับ โดยเลือกที่ porlar to rectangular

ก็จะออกมาแบบนี้

เทคนิคนี้เหมาะกับ texture ความละเอียดระดับกลางเท่านั้น เหมาะกับ shot ที่ไม่ได้ close up เข้าไปที่ตาของตัวละคร ถ้าต้องการ close upจำเป็นต้องมีการ paint ที่ละเอียดกว่านี้ มากครับ ต้อง paint ให้เห็นเส้นใยของม่านตาและเส้นเลือดฝอยรอบดวงตาอย่างชัดเจนแต่เท่านี้ก็เพียงพอในการทำตาของตัวการ์ตูนทั่วไปได้ครับ ถึงคิวของ renderman แล้วครับ ลองดูตัวอย่าง slim template ด้านล่าง...

slim template ด้านบนนี้เดิมเป็น template ของ ceramic shader แล้วนำมาปรับแต่งโดยสังเกตที่hilight เอาไว้คือส่วนทีเพิ่มเข้าไปครับ shader ตัวนี้เป็นตัวอย่างที่ดีของ การส ร้าง และเรียกใช function ใน slim template
บรรทัด color Glossy... คือการเริ่มสร้าง function คล้ายกับภาษา C คือมีรูปแบบ
ชนิดข้อมูลส่งกลับ ชื่อfunction (ชื่อและชนิดข้อมูลส่งเข้า function) {
....
เนื้อหาของ function;
renturn ตัวแปลที่ต้องการส่งกลับ;
}

function ตัวอย่างด้านบนส่งกลับข้อมูลแบบ color นั่นคือมีหน้าที่คำนวณสีแล้วส่งกลับมานั่นเอง
function Glossy ทำหน้าที่คำนวณ specular แทน function specular ตัวเดิม เพื่อให้ได specular ที่สามารถควบคุมความคมได 
illuminance (P, N, PI/2) {
/* Must declare extern L & Cl because we're in a function */
extern vector L; extern color Cl;
float nonspec = 0;
lightsource ("__nonspecular", nonspec);
if (nonspec < 1) {
vector H = normalize((L*offset)+V);
C += Cl * ((1-nonspec) *
smoothstep (.72-w, .72+w,
pow(max(0,N.H), 1/roughness)));
}
}
illuminance loop คล้าย loop while ในภาษา C ครับ แต่จะทำงานโดยอัตโนมัติวนลูปตามจำนวนไฟที่มีในฉาก โดยมีvector L เป็นตัวบอกตำแหน่งของไฟ และ color Cl บอกสีของไฟ
vector H = normalize((L*offset)+V);
บรรทัดนี้เดิมมาจาก
vector H = normalize(normalize(L)+V);
V คือ vectorบอกตำแหน่งของกล้อง ดังนั้นเมื่อนำ L และ V มาบวกกัน จะได vector ที่ชี้ระหว่างแสงและกล้อง ถ้า vector ตัวนี้ขนานกับ normal vector (Nn) ก็คือเป็นจุดที่แสง สะท้อนเข้ากล้องพอดีspecular มีค่ามากที่สุด
ค่า offset คือค่าที่ผมเพิ่มเข้าไปครับ เพื่อเปลี่ยนขนาดของ L ผลที่ได้คือทำให้ตำแหน่งของ specular เปลี่ยนไปตามค่า offset ทำให้เราควบคุมตำแหน่งของ specular ได้ในระดับ หนึ่ง
C += Cl * ((1-nonspec) * smoothstep (.72-w, .72+w, pow(max(0,N.H), 1/roughness)));
บรรทัดนี้เดิมจาก shader แบบ Phong คือ
C += Cl * (1-nonspec) * pow(max(0,N.H), 1/roughness);
function smoothstep ทำหน้าทแปลงค่าให้อยู่ในช่วงที่กำหนด เช่นกำหนดช่วง ตํ่าสุด .3 มากสุด .7 ถ้าค่าที่input เข้าไปคือ .1 output จะได้ค่า 0 ถ้า input เป็น .8 uotput จะ ออกมา 1 แต่ถ้าอยู่ระหว่าง .3 ถึง .7 จะทำการ interpolate ค่าตั้งแต 0-1 กลับออกมาเป็น output เป็นผลให specular มีความคมมากขึ้น และขึ้นกับค่า sharpness
สุดท้ายผมเอา specularcolor ไปคูณกับเทอมของ Ks เพื่อให้สามารถเปลี่ยนสีของ specular ได้ด้วยครับ
สร้าง slim template เสร็จก็จัดการโหลดเข้ามาตามขึ้นตอนของตอนที่แล้วครับ และเริ่มสร้าง shader ได้เลย

อันนี้ก็หน้าตาลอง shading network ที่ทำเสร็จแล้วครับ ลองมาดูกันทีละตัว... เริ่มจาก blin4 ตัวนี้คือ ตัวสร้างสีให้กับม่านตาครับ

ตั้งค่า Eccenticity และ Specular Rolloff ตามสมควรครับ แล้วลอง render ดูเราจะทำการใส texture ลงไป 2 ส่วนคือ surface color และ specular color surface color ก็คือภาพม่านตาที่วาดมาในตอนต้นนั่นเองครบ ส่วนภาพ specular color คือภาพ surface colorนั่นเองเพียงแต่นำมาเพิ่มสีดำสนิท ลงไปในส่วนของตาขาวครับ เพื่อไม่ให้สะท้อนแสงมากจนเกินไป

เนื่องจาก renderman รู้จักแค file .tex เท่านั้นในการทำ texture เราจึงต้องเปลี่ยน .tif ที่เราสร้างจาก Photoshop เป็น .tex โดย เลือกConvert>>Convert Textures และ เลือก smode periodic เพื่อไม่ให้ขอบด้าน s เป็นสีดำ เมื่อ Blin เสร็จก็จัดการต่อเข้ากับ ensemble_c ครับ

blin จะรับหน้าที่เป็น surface ของ ensemble เราต้องเพิ่มช่อง displaement ลงไปครับ โดยเลือก displacement แบบ simple

ช่อง displacement ใส colortogray ลงไป

เนื่องจาก displacement รับเฉพาะสีขาวดำ (float) เท่านั้น จึงต้องเปลี่ยนจากสีเป็นขาวดำก่อนครับ ต่อ inputcolor เข้ากับ colorramp...

เลือก ramptype เป็น T Ramp และตั้งสีขาวดำตามภาพเพื่อให้มีการ bump เกิดขึ้นที่ม่านตา ตรงนี้ก็เสร็จในส่วนของ ensemble_c ครับมาต่อกับในส่วนของ ensemble_s ซึ่งรับหน้าที่ในการสร้าง specular...

ต่อ offsetceramic ที่เราสร้างขึ้นเข้ากับ surface ของ ensemble_s และต่อ simple เข้าไปที่displacement คล้ายกับ ensemble_c แต colorramp จะแตกต่างกัน

colorramp ในส่วนนี้จะทำให้ตานูนขึ้นมาเพื่อรับ specular ได้ตรงตำแหน่งมากขึ้นครับ เมื่อเสร็จทั้งสอง ensemble ก็สร้าง ensemble adaptor มาหนึ่งตัว เพื่อเป็นตัวสลับ ensemble

กดปุ่ม add condition ก็จะมีปุ่มให้เราต่อ ensemble_c เข้าไปที่บรรทัดแรกตั้งชื่อ eye_color และ ensemble_s เข้าบรรทัดที่สอง ตั้งชื่อ eye_specular และ attach ensemble adaptor เข้าไปที่sphere ที่เราสร้างขึ้นใน Maya ได้เลยครับ

จัดแสงง่ายๆ และเปิด render global ของ renderman ขึ้นมาดู

ช่อง context เราต้องใส่ชื่อของ ensemble ที่ต้องการ render ครับ เช่น eye_color

ทำการ render ออกมา 2 ครั้งก็จะได้ออกมาแบบนี้ครับ shake เจ้าเก่าทำหน้าที่composite...

ต่อเข้าด้วยกันแบบ IAdd ก็เห็นผลลัทพ์ครับ :)

<<Back