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

[Thin Translucency]
translucency ถ้าจะแปลให้ตรงตัวเลยก็แปลว่า กึ่งโปร่งใส เช่นกระดาษ เมื่อใช้ไฟส่องผ่นด้านหลังของกระดาษ (ด้านที่ไม่โดนไฟ) จะสว่างเนื่องจากมีแสง ผ่านไปได ้ปราการณ์แบบนี้เกิดขึ้นกับวัตถุหลายๆอย่างครับ เช่นผ้า กระจกขุ่นพลาสติกขุ่นบาง ในขณะเดียวกันวัตถุหลายชนิดก็ไม่ได้มีคุณสมบัตินี้เช่นโลหะ ต่างๆ หินบางชนิด และวัตถุทึบที่แสงไม่สามารถส่องผ่านได ้
เอาล่ะ รู้จักกันแล้วมาลองดูครับ ว่าเราจะจำลองภาพที่แสงส่องผ่านไปด้านหลังได้อย่างไร

โดยปกติแล้วเมื่อวางแสงเอาไว้เหนือวัตถุแบบนี้แสงจะให้ความสว่างเฉพาะผิวด้านที่หันเข้าหาแสงเท่านั้น

ดังนั้นเมื่อดูด้านล่างก็จะเห็นว่าผิวของวัตถุมืดสนิท

ลองมาดูกันครับ ถ้าเราวางกล้องเอาไว้แบบนี้ในขณะ render ภาพ มีการคำนวณอย่างไร

surface
plastic( float Ks=.5, Kd=.5, Ka=1, roughness=.1; color specularcolor=1 )
{
normal Nf;
vector V;
Nf = faceforward( normalize(N), I );
V = -normalize(I);
Oi = Os;
Ci = Os * ( Cs * (Ka*ambient() + Kd*diffuse(Nf)) +
specularcolor * Ks * specular(Nf,V,roughness) );
}
จาก Shading Language ด้านบน ซึ่งเป็น shader แบบ plastic ธรรมดา มีการส่ง Nf ซึ่งเป็น unit vector ของ N (Normal Vector ที่จุด P) ไปในฟัง ชั่น diffuse ซึ่ง diffuse จะทำหน้าที่คำนวณค่าแสงของแสงที่อยู่ในทิศทางที่N ชี้ไป และกวาดเป็นมุม +- 90 องศา (PI/2) เท่านั้น ดังนั้น แสงที่ไม่ได้อย ู่ในขอบเขตนี้ในรูปคือครึ่งวงกลมสีเทา จะไม่ได้ทำการคำนวณรวมเข้าไปด้วย
ดังนั้นถ้าเราเพิ่ม อีกด้านเข้าไปโดยการส่ง -N เข้าไป ก็จะเป็นการเพิ่มแสงด้านหลังเข้าไปนั่นเอง
surface
doubleSide(float Ka = 1;
float Kd = 1;
float Kd2 = 1)
{
normal Nf = faceforward(normalize(N), I);
Oi = Os;
Ci = Os * Cs * (Ka * ambient() + Kd * diffuse(Nf) + diffuse(-Nf) * Kd2);
}
โค้ดด้านบนเพิ่ม diffuse(-Nf) * Kd2 เข้าไป (ตัดส่วนของ specular ทิ้งเพื่อไม่ให้ซับซ้อนเกินไป) เราสามารถทดสอบใช Shdaer ตัวนี้ได้โดยตรงโดย การ complie จาก .sl เป็น .slo โดยใช shader.exe และโหลดเข้าไปใน slim แต่เพื่อให้ใช้งานได้ง่ายขึ้น ผมจะเขียนเป็น slim template ครับ
slim 1 extensions pixardb {
extensions pixar pxsl {
template shadingmodel doubleSide {
parameter color sfcolor {
label "Surface Color"
description {Surface Color}
detail varying
default "1 1 1"
}

label "Back Surface Color"
description {Surface Color}
detail varying
default "1 1 1"
}
parameter color sfopacity {
label "Surface Opacity"
description {Surface Opacity}
detail varying
default "1 1 1"
}
parameter float Ka {
label {Ka}
description {Ka}
detail varying
default 1
}
parameter float Kd {
label {Kd}
description {Kd}
detail varying
default 1
}
parameter float Kd2 {
label {Kd2}
description {Kd2}
detail varying
default 1
}
collection shadingmodel shadingmodel {
access output
display hidden
parameter color CI {
detail varying
default {0 1 0}
access output
}
parameter color OI {
detail varying
default {1 1 1}
access output
}
}
RSLFunction {
void pxsldoubleSide(
color sfcolor;
color bksfcolor;
color sfopacity;
float Ka;
float Kd;
float Kd2;
output color CI;
output color OI;){
extern normal N;
extern vector I;
normal Nf = faceforward(normalize(N), I);
OI = Os*sfopacity;
CI = Os * Cs * (Ka * ambient() + sfcolor * Kd * diffuse(Nf) + bksfcolor * diffuse(-Nf) * Kd2);
}
}
}
}
}
แปลงเป็น slim template และเพิ่ม sfcolor และ bksfcolor เข้าไป เพื่อให้สามารถควบคุมสีด้านหน้าและด้านหลังได้ง่ายขึ้น slim template จะเป็น text file มีนามสกุล .slim และโหลดเข้าไปใน slim ได้โดยการพิมพ

slim ReadSlimFile file.slim ใน slim console... เรื่องการเขียน slim template และ Shading language จะเขียนถึงโดยละเอียดอีกทีในโอกาศต่อไปครับ เอาล่ะโหลดเข้าไปแล้วเรียบร้อย มาดูฉากที่เราจะ render กันก่อนครับ

ฉากที่เห็นเป็นฉากง่ายๆที่มีการจัดแสง 3 ดวง โดยจะให้แสงด้านหลังส่องทะลุใบไม้เข้ามา และเงาของตัวละครตกลงบนใบไม ้ก่อนอื่นจะ render แยกตัวละครออกก่อนครับ เพื่อในไป composite ที่หลัง ใส Matte ลงไปที่ใบไม้โดยใช RIBbox

แล้ว attach ลงไปที่ใบไม ้จะทำให้ใบไม้กลายเป็น Matte object คล้ายกับ BlackHole ของ Maya ครับ

ออกมาแบบนี้โดยได alpha เฉพาะตัวละครมาด้วยทำให้เรา composite โดยใช Add ได้โดยง่าย ถึงตาของใบไม้บ้างครับ ลย RIBbox ของใบไม้ทิ้งเพื่อยกเลิก Matte และตั้งค่า primary visibility ของตัวละครเป็น off

จะใช attribute editor หรือ attribute spread sheet ก็ตามสะดวก ถ้าตัวละครมีหลายชิ้นใช attribute spread sheet ก็จะ สะดวกดีครับ จากนั้นก็จัดการสร้าง doubleSide shader ที่เราเขียนขึ้นมา attach ลงบนใบไม ้

ใส texture ลงไปสองอันที่front color และ back color อันเดียวกันหรือต่างกันก็ได้ครับ ในกรณีนี้ผมอยากให้สีที่ทะลุเข้ามา สดกว่าสีด้านหน้า ก็เลยเอา ภาพไปแต่งใน photoshop แล้วเข้ามาแปะครับ หรืออาจจะเป็นคนละภาพไปเลยก็ได ้อันนี้แล้วแต่กรณีไป

ที่นี้เรื่องเงา เราต้องการแยกเงาออกเพื่อจะปรับสีภาพหลังได้ง่าย ดังนั้นไฟก็ต้องปิดเงาซะก่อนครับ โดย set ค่า frequency เป็น never ก็จะไม่มีการ คำนวณเงา

ในจอของ doubleSide มีตัวแปลที่ชื่อ Kd และ Kd2 ซึ่งเป็นตัวควบคุมประมาณสีของด้านนอกและด้านใน ด้ามลำดับ เราจำ renderแยกกันครับ ดังนั้นใน ครั้งแรก ผมจะ render ด้านนอกก่อน จึงตั้งค่า Kd2 เป็น 0

ออกมาได้สีด้านนอก ซึ่งไม่ดำเนื่องจากมีไฟอีกสองดวงส่องเข้าด้านหน้าครับ

อีกครั้ง สลับกันให Kd เป็น 1 และ Kd2 เป็น 0

ได้ออกมาโดยจะเห็นว่าภาพที่render ออกมาเป็น texture คนละตัวกัน และการคำนวณแสงต่างกัน

สุดท้ายคือเงาครับ แต่ก่อนจะ render เงาก็ต้องเปิดเงาซะก่อน เปลี่ยน frequency จาก never เป็น every frame ครับ
ผมเขียน slim template อีกอันเพื่อรับเงาโดยเฉพาะ
slim 1 extensions pixardb {
extensions pixar pxsl {
template shadingmodel collectshd {
label "collectShadow"
collection shadingmodel shadingmodel {
access output
display hidden

parameter color CI {
detail varying
default "0 0 0"
access output
}
parameter color OI {
detail varying
default "0 0 0"
access output
}
}
RSLFunction {
void
pxslcollectshd(
output color CI;
output color OI; )
{
extern point P;
color Cl=0;
float lightnum=0;
illuminance(P)
{
lightnum += 1;
color shadow=1;
lightsource( "__inShadow", shadow );
C+=shadow;
}
if(lightnum > 0)
Cl /= lightnum;
CI = Cl;
OI = Cl;
}
}
}
}
}
โหลดเข้าไปโดยใช slim console เหมือนเดิมครับ แล้ว attach ลงไปที่ใบไม 

ก็ได้เงาออกมาตามต้องการ ขั้นตอนการ composite ครับ ผมก็จะใช shake เจ้าเก่า

ถ้าอยากได grow ก็ลองแยกส่วนสว่างออกมาเบรอแล้ว add ลงไปครับ

ออกมาง่ายๆแบบนี้...
เทคนิคนี้ใช้ได้ดีกับวัตถุที่บาง เช่น กระดาษ ใบไม ้ผ้า เหล่านี้เป็นต้น สำหรับวัตถุบางอย่างเช่น ใบไม้ที่มีความหนาไม่สมํ่าเสมอ พังพืดของเท้ากบ จะมีส่วนที่ใสไม่เท่ากัน ซึ่งเราสามารถ paint texture แล้วใส texture ลงไปที่Kd2 ได้ครับยกตัวอย่างเช่นใบไม้ที่มีเส้นใยชัดเจอ เราอยากให้ส่วนที่มีเส้น ทึบ และ ส่วนที่ไม่มีสว่างก ็ใส texture ให้ส่วนที่เป็นเส้นใยมีสีดำ ส่วนไม่มีเส้นใส่ที่ขาว ก็ได้ตามที่ต้องการครับ ในกรณีนี้จะต้องเขียน shader ของตัวรับเงาใหม่ด้วย เพื่อให้ได้เงาที่ไม่สมํ่าเสมอตามความหสาของวัตถุ
ข้อจำกัดของวิธีนี้คือใช้กับวัตถุที่มีปริมาตรได้ไม่ดีเช่นรูปปั้นกระจกขุ่น ผิวหนังคน จำเป็นต้องมีการคำนวณที่ซัซ้อนกว่านี้ซึ่งก็คือการทำ sub surfacescattering นั่นเอง ไว้โอกาศหน้าเจอกันเรื่องนี้ครับ

<<Back