Sunday, January 25, 2015

เสริมความสมจริงให้ Material (1) - Reflection

สวัสดีครับ

ผมมีโอกาสได้ดูการจำลองวัสดุจริงใน MAX+Vray ของ Grant Warwick ซึ่งเยี่ยมมากครับ ผมสงสัยมากว่าจะสามารถจำลองเทคนิกที่เขาแสดง ใน Maya ได้ไหม...

บทความซีรีส์นี้ คือผลจากการทดลองศึกษาดังกล่าว การจำลองคุณสมบัติของ Material ในชีวิตจริงด้วย Maya + Vray...

วัสดุในโลกจริง มีรายละเอียดยิบย่อยในระดับ micro detail มากมาย บางอย่างถ้าไม่ตั้งใจมองอาจไม่สังเกตเห็นเลยก็ได้ การจำลอง detail ยิบย่อยเหล่านี้ต้องแลกด้วยเวลา Render ที่เพิ่มขึ้นพอสมควรจึงเหมาะกับงานพิมพ์ใหญ่ๆ งาน VFX หรืองานที่ต้องการความสมจริงสูง มากกว่างานเกมหรือการ์ตูน

download:
- Sample-Scene จาก vray-materials.de แปลงเป็น fbx แล้ว

สำหรับในส่วนแรกผมจะเริ่มจาก Reflection โดยใช้ถังน้ำพลาสติกใบนี้เป็นตัวอย่าง
ส่วนแรกสุดซึ่งไม่แปลกใหม่อะไร แต่ก็สำคัญจนข้ามไม่ได้ คือ Fresnel Reflection

Fresnel Reflection คือการที่เงาสะท้อนบนพื้นผิวที่หันออกไปจากมุมมองของเรา (ขอเรียกว่า 90 องศา) ชัดเจนกว่าพื้นผิวที่หันมาหาเราตรงๆ สังเกตเงาตรงด้านข้างของถังใบเดิม


นอกจากนั้นยังมีคุณสมบัติอย่างหนึ่งที่ไม่ค่อยมีใครพูดถึงนัก คือ เมื่อใกล้ 90 องศา เงาจะคมชัดขึ้นด้วย

ส่วนที่ 2 ผมคิดว่าน่าสนใจกว่า คือ การซ้อนทับกันของ Reflection
ตัวอย่าง บริเวณฝาถัง

เหลือง คือเงาที่เบลอมาก มีผลทำให้เห็นสีของถังอ่อนลงเท่านั้น
เขียว คือเงาที่คมขึ้น ซ้อนทับไปบนเหงาเหลือง
แดง คือไฮไลท์ที่ยิ่งคมขึ้นอีก ทับอยู่บนเขียวอีกทอดหนึ่ง

ลักษณะเงาสะท้อนแบบนี้พบเห็นได้ในวัสดุทุกชนิด ยกเว้นก็เพียงวัสดุที่ผิวเรียบจนเงาสะท้อนคมชัดเหมือนพวกกระจก

 มาเริ่มจากวิธีง่ายกันก่อน

เราจะใช้ Fresnel ที่มีมากับ Vray Material เลย เมื่อดูจากตารางแล้ว พบว่า IOR ของพลาสติกอยู่ระหว่าง 1.3-1.7 ส่วนสีฟ้าของเนื้อพลาสติกต้องเผื่อให้เข้มและสดกว่าที่เห็นในภาพ เพราะ reflection จะทำให้เราเห็นสีพื้นอ่อนและจางลง


จากนั้น Render ภาพออกมา 3 ภาพ โดยแต่ละภาพเราจะใช้ ค่า Reflection Glossiness ต่างๆ กัน

ซ้ายไปขวา Glossiness 0.5, 0.8, 0.94

นำมาวางทับกันใน Photoshop แล้วปรับ Layer Opacity ตามความเหมาะสม
Photoshop Layer จากบนลงล่าง
Glossiness 0.94 = 15%
Glossiness 0.8 = 30%
Glossiness 0.6 = 100%
อย่างที่บอกไว้เลยใช่ไหมครับว่าถ้าไม่ตั้งใจมองคงไม่เห็นความแตกต่าง

หลายคนอาจคุ้นกับการรวม reflection ด้วยการใช้ Over lay ใน Vray Blend แต่นั่นไม่ใช่วิธีของเรา ก่อนอื่นต้องเข้าใจว่าโดยธรรมชาติของการสะท้อนแสงนั้น หากแสงส่องมา 10 มันไม่มีทางสะท้อนออกไป 11 แน่ๆ การใช้ Over lay จะมีโอกาสเป็นอย่างนั้นได้

ต่อมาเราจะมาดูอีกจุดหนึ่งที่ผมพูดถึง คือการทำเงาสะท้อนบริเวณใกล้ 90 องศาให้คมชัดกว่าตรงกลาง โดยการใช้ Sampler Info Facing Ratio ควบคู่กับ Remap Value เพื่อส่งค่าไปยัง Glossiness

มาดูตัวอย่างกันด้วยการใส่ surface shader ให้ poly sphere

1. สร้าง samplerInfo และ remapValue
2. เชื่อม Facing Ratio > Input Value


 3. จาก remapValue เชื่อม Out Value ไปยัง outColorR, G, B ของ surface shader


ถ้าไม่มีให้เลือกโดยตรง ให้เลือก Other ก่อนเพื่อเปิดหน้าต่างนี้


ส่วนที่เราสนใจคือกราฟสำหรับ remap value กดที่ลูกศรเพื่อขยายมันขึ้นมา


สังเกตดูน่าจะพอบอกได้ว่าทางซ้ายของกราฟ คือ 90 องศา และทางขวา คือ 0 องศา ซึ่งสลับข้างซ้ายขวากับชาวบ้านโดยส่วนใหญ่ ไม่ว่าจะกราฟ IOR ตามเวบไซต์ หรือกราฟ fall off ของ MAX


ทีนี้เราจะนำมันมาใช้กับ Material กระป๋องของเรา
จับ Out Value ต่อกับ Reflection Glossiness

เริ่มจาก Glossiness 0.6 กันก่อน เราทำได้โดยการปรับกราฟครึ่งขวาให้มี value ราว 0.6
และปรับกราฟทางริมซ้ายให้โค้งขึ้น เพื่อให้บริเวณใกล้ 90 องศามีค่า glossiness สูงขึ้น

 Maya ไม่ได้ให้เครื่องมือบิดกราฟมาเท่าไรนัก กราฟโค้งไม่สวยไม่เป็นไร เชื่อมแต่ละจุดด้วยเส้นตรงเลยก็ยังใช้งานได้

ในภาพผมเซตผิดไปหน่อย เป็น 0.5
ใช้วิธีการปรับกราฟตามที่แสดงให้ดู Render ออกมา 3 ภาพที่ glossiness 0.6, 0.8 และ 0.95


จับซ้อนกัน ปรับ opacity เหมือนก่อนหน้านี้


ก็จบบทแรกเท่านี้ครับ

ในบทต่อไป เราจะไม่ใช้ Fresnel ที่มากับ Vray แล้ว แต่จะใช้ Sampler Info + Remap Value ในการกำหนดการสะท้อน แยก R G B ตามวัตถุในโลกจริง และจะรวมเงาสะท้อนทั้ง 3 แบบจบใน Maya+Vray เลย

Monday, July 28, 2014

Guilty Gear Xrd part 2 - Animation & etc.

หวังว่า Part 1 จะไม่ผิดพลาดมากนักนะครับ ใครเจอผิดตรงไหนช่วยท้วงได้เลยครับผม
Part 1 - Modeling, Shading, Lighting

ทีนี้เรามาดู Part 2 กันต่อครับ ซึ่งขึ้นต้นได้น่าสนใจ

“การโยน Toon shade ใส่โมเดล ใครๆ ก็ทำได้
แต่จะสร้างอารมณ์แบบ 2D มันมีองค์ประกอบมากกว่านั้น”


ต้นฉบับ - http://www.4gamer.net/games/216/G021678/20140714079/

ตอนที่ Trailer แรกของเกมออกฉายนั้น ก่อให้เกิดหัวข้อถกเถียงเป็นวงกว้างกว่าเกมนี้เป็น 3D จริงๆ น่ะหรือ ซึ่งสิ่งที่ทำให้ผู้คนมากมายแยกไม่ออกนั้น ไม่ใช่ Toon shade แต่เป็น Animation

จากที่ผ่านมา แม้ว่าจะมีเกมและการ์ตูนมากมายพยายามทำให้ดู 2D ด้วยการใส่ Toon Shade แต่ด้วยวิธีการแอนิเมตแบบ 3D ทำให้ไม่ว่าดูอย่างไร ก็ไม่ใช่ 2D อยู่ดี ตัวอย่าง

ในขณะที่ Guilty Gear นั้น ดึงคอนเซปต์ของ Sprite Animation มาใช้อย่างเต็มตัว



ท่วงท่าใน Animation ทั้งหมดจะวาดเฟรมต่อเฟรมเหมือน Sprite แล้วถึง pose ตัวละครให้ตรงกับภาพวาดเหล่านั้น เรียกว่าเป็นการแอนิเมตแบบ pose-to-pose โดยไม่มี in between ก็ว่าได้





ทีวีญี่ปุ่นใช้ fps ที่ 24 อะนิเมะจึงมักใช้ 12 fps
แต่สำหรับเกมนั้นจะมี fps อยู่ที่ 30- 60 Guilty Gear จึงปรับใช้การแอนิเมตที่ 15 fps โดยตัวเกมยังคงทำการคำนวณผลที่ 60 fps ตามเดิม ทำให้สามารถกระโดดลอยตัว ขึ้นหน้าถอยหลัง ออกท่า และอื่นๆ ไหลลื่นได้เหมือนปกติ

นอกจากนี้ยังมีประเด็นเรื่องการจัดไฟแบบเฟรมต่อเฟรมจากบทความที่แล้ว ซึ่งยิ่งทวีความสำคัญขึ้นไปอีกสำหรับซีน Cinematic Instant Kill ซึ่งมีการเคลื่องไหวกล้องหลากหลายมาก ทั้งเข้าใกล้ถึงรูจมูก หรือบินวนรอบคาแรกเตอร์อย่างรวดเร็ว

ตัวอย่าง Cinematic Instant Kill ของ May ... ความเร็วจริง ต้องเพิ่ม 2 เท่านะครับ หรือถ้าใครใช้ Chrome ก็เลือก speed 2x ได้เลย



นอกจากนี้ ยังมีการสลับชิ้นส่วนโมเดลแบบเฟรมต่อเฟรม เนื่องจากหลายๆ ท่วงท่า ตัวโมเดลมีการเปลี่ยนรูปไปอย่างสิ้นเชิง ซึ่งไม่อาจทำ blend shape ได้เลยด้วยข้อจำกัดทาง Topology
 
ทรงผมต่างๆ ของ Milia
Joint ต่างๆ ยังบิดได้มากกว่าความเป็นจริงเพื่อให้สามารถหลอกทวงท่าตามต้นแบบ 2D ได้ เช่นใบหน้าที่สามารถย้าย ดวงตา จมูก ปากได้ค่อนข้างมาก

ตัวอย่าง Bedman ซ้ายคือโมเดลปกติ, กลางคือแบบสำหรับแก้ไข, ขวาคือโมเดลที่แก้ตามแบบแล้ว
สังเกตว่า ปาก ตา จมูก ถูกเลื่อนขึ้นให้เกิดที่ว่างบริเวณคาง


ส่วน ใบหน้าอื่นๆ ที่เป็นเอกลักษณ์การ์ตูนญี่ปุ่น อย่าง XD หรือ >_< นั้น ทางทีมใช้วิธีสลับหัวเลยครับ เหมือนที่สลับหัวสำหรับระยะใกล้-ไกลในบทความก่อน

การโพสต์ท่าตัวละครตามภาพวาด 2D เอง ก็ต้องมีการยืดหดและบิดหลอกค่อนข้างมาก เนื่องจากหลายๆ ท่า ไม่อาจทำแบบปกติได้เลยแม้ว่าจะเอามุมกล้องช่วยแล้วก็ตาม การ Scale joint ได้ในทั้งแกน x y z จึงมีความสำคัญมาก แต่เนื่องขจาก Unreal Engine 3 ไม่อาจทำได้ ทีมงานจึงจำเป็นต้องเขียนเพิ่มลงไปเองใน Source Code (แต่ Unreal Engine 4 ทำได้แล้ว)

ระบบที่พัฒนาขึ้นมานั้นสามารถนำไปใช้ประโยชน์ได้หลากหลายมาก สามารถ ทำ squash/stretch ให้การเคลื่อนไหวมีความเป็นการ์ตูนมากขึ้น หรือหมัดที่หนักก็จะมีการขยายมือให้ใหญ่ขึ้นได้ เป็นต้น
 
Scale joint เพื่อออกหมัด ใน Softimage
ท่าชนะของ May มุมจริง กับมุมด้านหน้า
สำหรับเอฟเฟคต่างๆ เช่น ควันและไฟ ตอนแรกทีมงานคิดว่าจะใช้แผ่นแบน แต่เนื่องจากท่าไม้ตายมักมีการหมุมมุมกล้องประกอบ จึงจำเป็นต้องทำเอฟเฟคให้ดูดีจากทุกมุม หลังจากเสียเวลาทดลองดูหลายๆ แบบ ทีมงานก็ตัดสินใจ ปั้นมันเฟรมต่อเฟรมเลย ซึ่งกลับกลายเป็นว่าประหยัดเวลากว่ามาก

หรือ Sato ที่สามารถละลายร่างตัวเองได้ ก็มีโมเดลต่างหากสำหรับท่าละลายแต่ละเฟรมเช่นกัน

ควัน จาก 2 มุม
โมเดลควัน สำหรับแต่ละ Frame


ทีนี้มาดูด่านต่อสู้กันบ้างครับ


ฉากหลังของเกม 2D ใช้เทคนิกวางฉากหลังซ้อนกันเป็นชั้นๆ โดยชั้นที่อยากให้รู้สึกใกล้ก็จะเลื่อนตามกล้องไวกว่า ในขณะที่ชั้นที่ต้องการให้อยู่ไกลจะเลื่อนช้า

ในทางกลับกันถ้าเป็น 3D การจะวางให้ได้ฉากอยากที่ต้องการ บางส่วนอาจต้องวางไกลจากกล้องมากเสียจนการขยับกล้องแทบไม่มีผล ซึ่งไม่ใช่สิ่งที่ทีมงานต้องการ ทีมงานต้องการให้ฉากหลังมีการเคลื่อนไหวตามกล้องเสมอ ไม่นิ่ง ดังนั้นฉากหลังในเกมนี้จึงถูกวางไว้ใกล้กว่าที่ตาเห็นมากและใช้การหลอกมุมกล้องเอาแทน

ตัวอย่างโมเดลของตึกที่เห็นในภาพด้านบน


ข้อดีอีกอย่างคือเวลาออกท่าที่มี Cut scene มักมีการหมุนกล้องรอบตัวละครด้วย การทำฉากด้วยวิธีนี้จะทำให้ได้สโคปงานที่เล็กลงกว่าการทำเมืองขนาดเต็มมาก

ตัวอย่าง background ที่ใช้เทคนิกนี้ ด่านของ I-no



ส่วน Cut scene ที่ไม่ได้เกิดในฉากต่อสู้ จะใช้แผ่นแบนธรรมดา หรือใช้เพียงโมเดลง่ายๆ และอาศัย paint เอา ตัวอย่าง


ตัวประกอบในระยะไกลส่วนใหญ่ก็เป็นแค่แผ่นภาพเช่นกัน เช่นใน ฉากนี้ 

...
...

ทีนี้ก็มาถึงส่วนปลีกย่อยละครับ

สำหรับเกมต่อสู้นั้น ระบบโจมตีจะใช้การวาดกล่องในระนาบ 2D เพื่อกำหนดจุดโจมตี โดยแบ่งเป็น 2 อย่าง คือ คือ Hurt box กับ Hit box สำหรับฝ่ายรับ และฝ่ายรุก

ยกตัวอย่าง เวลาตัวละครตัวนึงออกหมัด Hurt Box จะครอบอยู่ที่กำปั้น ในขณะที่อีกฝ่ายจะมี Hit Box ครอบอยู่รอบตัว เมื่อกล่องทั้งสองสัมผัสกัน ก็จะถือว่าการจู่โจมนั้นเข้าเป้าแล้ว

Hit box สีแดง... Hurt Box สีน้ำเงิน

ปัญหาที่เกิดขึ้น คือคาแรกเตอร์อาจมีบางส่วนของร่างกายที่อยู่ไกลจากกล้องออกไป ซึ่งจะทำให้มีการย่อขนาดหรือบิดเบี้ยวไปตาม Perspective และหลุดออกไปจากกล่องเหล่านี้ ซึ่งวิธีการแก้ปัญหานั้น ทำได้โดยการ Project ตัวละครแบบ แบน 70% (Parallel) แต่เพื่อความสวยงามจะเก็บ Perspective ไว้เพียง 30% ซึ่งเป็นวิธีที่ริเริ่มขึ้นในเกม Street Fighter 4

การแก้ปัญหาดังกล่าวสามารถทำได้เพียงแนวนอนเท่านั้น ไม่อาจแก้แนวตั้งได้


ต่อ มาคือการยืนซ้อนกันของตัวละครซึ่งทางทีมต้องการให้ดูเหมือน Sprite ซ้อนกัน 2 ภาพ วิธีที่ใช้ คือหลังจาก Project ตัวละครแล้ว ภาพที่ได้จะอยู่ต่างระนาบกันบน Z Buffer ผลที่ได้คือตัวละครจะมีตัวหนึ่งอยู่หน้า ตัวหนึ่งอยู่หลังเสมอ และยังมีผลพลอยได้คือไม่ต้องกังวลเรื่องโพลิก้อนทะลุกันเองในเวลาที่ยืนใกล้กันมากๆ หรือกระโดดใส่กัน


การ หันซ้ายหัวขวาเองก็ทำเหมือน Sprite เช่นกัน โดยการ Flip ตัวละครเลย ไม่ใช้หันกลับด้านแล้วสลับแขนขาเหมือน Street Fighter โดยพวกตัวหนังสือต่างๆ จะแยก Texture ไว้ต่างหาก


 Texture ตัวหนังสือนั้นจะทำหน้าที่คล้าย  Screen บน Photoshop กล่าวคือ ส่วนสีเทาจะไม่มีผลอะไร ส่วนสีดำและขาวจะเพิ่มความมืด/สว่างให้กับ Texture


และสุดท้ายก็จะเป็นพวก post process ต่างๆ เช่น Anti Aliasing, ฺBloom, Diffusion filter ถ้าสนใจดูภาพเพิ่มเติมในส่วนนี้ กดดูได้จากภาพนี้เป็นต้นไป

ซ้ายไม่มี post process, ขวาเปิดทุกอย่าง
ในเวอร์ชัน Arcade นั้น ทีมงานอยากเน้นให้เล่นง่ายไว้ก่อน จึงไม่มีการเล่นกล้องอะไรมากนัก แต่เป็นไปได้ว่าอาจเปิดโอกาสให้เล่นกับโหมด 3D มากขึ้นสำหรับเวอร์ชัน Console

สุดท้ายทีมงานกล่าวว่าพวกเขาได้เรียนรู้เทคนิกใหม่ๆ มากมายจากโปรเจคนี้ครับ

...
...

จบแล้วครับ ขอบคุณที่แวะมาอ่านกันนะครับ ^-^

Guilty Gear Xrd part 1 - Model, Shading, Lighting

ทันทีที่ trailer Guilty Gear Xrd ออกมาให้ชมกัน Toon shade ของเกมนี้ก็กลายเป็นที่ฮือฮากันทันทีในเวบบอร์ด 3D หลายๆ แห่ง



ตัวเกมออกวางให้เล่นตามอาเขตตั้งแต่เดือนกุมภาพันธ์แล้ว จนมาถึงวันที่ 26 กรกฎาคม เวบ 4Gamer จึงได้ตีแผ่บทความของ Zenji Nishikawa ซึ่งมีเกร็ดน่าสนใจมากมายทีเดียว เนื้อหาใกล้เคียงกับที่ลงในนิตยสาร CGWorld แต่ Zenji กล่าวว่าไม่มีความเกี่ยวข้องกัน

บทความต้นฉบับ - http://www.4gamer.net/games/216/G021678/20140703095/
กระทู้ polycount ที่ถกกันเรื่องนี้ - http://www.polycount.com/forum/showthread.php?t=121144
PDF บทความใน CGWorld (ภาษาญี่ปุ่น) - https://dl.dropboxusercontent.com/u/2851501/CGW_GG.rar

ทริกที่ทีมพัฒนานำมาใช้เพื่อให้ภาพที่ได้ เหมือน 2D ที่สุดนั้น น่าทึ่งจริงๆ ครับ Physical ถือเป็นเรื่องรองไปเลย เรามาดูกันว่าเขาทำอะไรบ้าง

หากใครคล่องภาษาญี่ปุ่นและพบข้อผิดพลาดตรงไหนก็รบกวนช่วยแจ้งด้วยนะครับ



ผู้พัฒนาเลือกใช้ Unreal Engine 3 เพราะขณะนั้นมีราคาถูกมาก (ลดราคาเพราะ Unreal Engine 4 เพิ่งเปิดตัว) โดยมองที่ความเสถียร การซัพพอร์ต และการ export ไปลงเครื่องคอนโซลได้ง่าย

ทีมงานมองว่าการเขียนเอนจิ้นเองนั้นใช้เวลามากเกินไป (พวกเขาเคยลองแล้วตอนสร้างเกม GG Overture แต่ได้ผลไม่น่าพอใจ)  พวกเขามีโปรแกรมเมอร์เพียงไม่กี่คนเท่านั้น การที่สามารถใช้ script สั้นๆ ได้จึงมีข้อดีมากเพราะศิลปินเองก็พอจะปรับเปลี่ยนหลายๆ อย่างในตัวเกมได้เองโดยตรง  ทางทีมจึงทำการแปลงระบบพื้นฐานและเครื่องมือต่างๆ ที่เคยทำไว้แล้วให้สามารถใช้ในเอนจิ้นได้ด้วย

นอกจากนี้ทางทีมงานยังสร้าง Shader ให้ตรงกัน ทั้งใน Softimage และ Unreal Engine เพื่อให้ศิลปินสามารถดูผลได้ใน Softimage โดยตรง

Shader ใน Softimage
ทีมงานในขณะนั้นมีกัน 25 คน เป็นโปรแกรมเมอร์ 4 คน, เกมแพลนเนอร์ 3 คน และศิลปิน 12 คน นอกนั้นจะเป็น out source ซึ่งมีจำนวนราวร้อยคน

เกมเริ่มทำคอนเซปต์เมื่อปี  2008 และเริ่มโปรดักชั่นในปี 2011 พวกเขาลองสร้างแอนิเมชันสั้นๆ ขึ้นมาเป็นต้นแบบ ซึ่งช่วยให้พวกเขามั่นใจว่าจะทำเกมเป็น 3D ได้แน่ และนำไปสู่ขั้นโปรดักชันเต็มตัวเมื่อกลางปี 2012 จนเสร็จสิ้นเมื่อปลายปี 2013

ต้นฉบับทดลอง
อันที่จริงพวกเขาเคยลองทำ 3D มาตั้งแต่ปี 2007 แล้ว แต่ในขณะนั้นยังไม่ได้ผลที่น่าพึงพอใจ อีกทั้ง resolution ที่ค่อนข้างต่ำของหน้าจอ Arcade ทำให้พวกเขามองว่า 2D sprite แบบเดิมๆ ยังเป็นตัวเลือกที่ดีกว่า ต่างกับเกมเวอร์ชั่นล่าสด Xrd ซึ่งมีการแสดงผลได้ถึง 1280x720 สำหรับอาเขต และสูงถึง 1080p สำหรับ PS4

ทีมงานเลือกใช้ FXAA สำหรับ anti-alias และมี budget สำหรับ polygon ราว 8 แสน, 5 แสนสำหรับฉาก และ 2.5 แสนสำหรับตัวละคร ซึ่งอันที่จริง ตัวละครแต่ละตัวจะใช้ราว 4 หมื่นเท่านั้น จึงมีเหลือสำรองไว้สำหรับข้าวของต่างๆ ได้พอสมควร

โมเดลมีการสลับหัวสำหรับระยะใกล้-ไกล แต่ไม่ใช่ LoD นะครับเพราะ poly count ไม่ได้น้อยลงในระยะไกลเลย พวกเขาสลับหัวเพื่อเน้นบางส่วนให้โดดเด่นและเห็นได้ง่ายขึ้นในระยะไกล เช่น ทำผมให้หนาขึ้น ทำดวงตาให้ใหญ่ขึ้น เป็นต้น

ตัวอย่างด้านล่างคือ Milia ซ้ายคือใบหน้าในระยะใกล้ และขวาคือระยะไกล

Milia สลับโมเดลส่วนหัวสำหรับระยะต่างๆ
ใบหน้าของตัวละครมี bone หลายจุดมาก (ตั้งแต่ 170 จุดขึ้นไป)เพื่อให้สามารถจัดหน้าได้เหมือน 2D อย่างไม่มีขีดจำกัด สามารถบิดจมูก ย้ายปาก ฯลฯ สุดแต่เราต้องการ คุณสมบัติดังกล่าวรวมไปถึงลำตัว ผม เสื้อผ้า ด้วย เพื่อให้สามารถจัดท่าได้เหมือน 2D แทบทุกกระเบียดนิ้ว รวมแล้วบางตัวมี bone ถึง 600 กว่าจุดทีเดียว

ออ เสื้อผ้าเกมนี้ไม่มีซิมนะครับ แอนิเมตมือล้วนๆ ทุกอย่าง



การเรนเดอร์นั้นจะแบ่งออกเป็น 4 pass ได้แค่ Z, สี, เส้น, และสุดท้ายเป็นตัวโมเดล มี Texture ของฉากราว 160Mb มี shader ราว 60-70 shader ซึ่งสร้างใน Unreal Engine ทั้งหมด

อย่างที่กล่าวข้างต้นว่าความถูกต้องไม่ใช่สิ่งที่เกมนี้ต้องการ
- แสงเงาของฉากหลังเป็น paint ทั้งหมด


- มีแสง 1 ดวงที่มีหน้าที่ทอดเงาตัวละครลงพื้นเท่านั้น
- ตัวละครแต่ละตัวจะมีไฟประจำตัวอีกดวงนึง ทำหน้าที่กำหนดทิศทางแสง เพื่อให้ได้ส่วนมืดที่ถูกต้องดูดีที่สุดโดยไม่สนทิศทางแสงของฉากหลัง ไฟดวงนี้จะ animate เฟรมต่อเฟรมเพื่อให้ได้แสงที่สวยในทุกอิริยาบท
- ตัวละครจะไม่มีการทอดเงาลงบนตัวเอง แสงเงาที่เห็นเกิดจากฟอร์มของโมเดลเท่านั้น

ซ้ายคือวางแสงตามฉากหลัง ขวาวางแสงจัดโดยไม่สนใจฉากหลัง


ในส่วนของ Cell Shade นั้น ถือว่าเป็น Cell Shade แบบดั้งเดิมธรรมดา แต่ส่วนที่ทีมงานให้ความสนใจเป็นพิเศษก็คือเงา เพราะโดยส่วนใหญ่แล้ว Cell Shade จะดูไม่สวย และดูเป็น 3D ก็ตรงเงานี่แหละ

เทียบ ซ้ายคือแสงเงาที่มองออกว่าเป็นโมเดล 3 มิติ ในขณะที่ภาพขวาซึ่งผ่านการใช้ลูกเล่นและเทคนิกต่างๆ แล้ว จะดูใกล้เคียง anime กว่า


อย่างแรก มีการใช้ Red Channel ของ vertex color ในการควบคุมเงา vertex ไหนมีค่า R น้อย ก็จะเกิดเงาได้ง่ายกว่า ซึ่งการคำนวณหาค่า R นี้ จะใช้วิธีคล้ายๆ การคำนวณ Ambient Occlusion

ซ้ายคือ R Channel แสดงผลแบบขาวดำ ซึ่งคล้าย AO มาก
กลางคือแสงเงาที่เกิดจากทิศแสงตรงๆ
ขวาคือแสงเงาเมื่อนำค่า R จากภาพแรกมาคำนวณแล้ว


ถัดมาครับ คือ Texture ที่เอาไว้ควบคุมแสงเงาที่ทางทีมตั้งชื่อว่า ILM Texture ซึ่งไม่เกี่ยวอะไรกับลูคัสนะครับ

Green Channel ของ ILM Texture เป็นการควบคุมความสว่างโดยตรง ทำให้ทีมงานสามารถหลอกให้เหมือนตัวละครทอดเงาลงบนตัวเองได้ ทั้งที่ความจริงไม่มี ตัวละครจะทอดเงาลงพื้นเท่านั้น


ส่วน Red เอาไว้ควบคุมความสว่างของไฮไลท์ ในขณะที่ Blue Channel ไว้ควบคุมขนาด ยกตัวอย่าง I-No ซึ่งมีขนาดไฮไลท์ต่างกันระหว่างซ้ายและขวา



รายละเอียดยิบย่อยของโมเดลที่จะทำให้เกิดแสงเงาเล็กๆ จนไม่สวยนั้น ทางทีมงานใช้วิธีนำ Normal จากโมเดลที่เรียบง่ายกว่ามาใช้ในการคำนวณแสง ทำให้สามารถกำจัดหลืบเงาเล็กๆ เหล่านั้นได้ เช่น บนเส้นผม หรือบนกางเกง


ต่อมา การคำนวณสีของเงา ทางทีมจะใช้ SSS Texture ซึ่งก็อีกนั่นแหละ ชื่อ SSS แต่ไม่เกี่ยวอะไรกับ Sub Surface Scatter


ซึ่งวิธีคำนวณโดยคร่าวๆ จะมีการแยกคำนวณสีส่วนสว่าง กับสีส่วนเงา ดังนี้

สีส่วนสว่าง = ( สีแสง + สี ambient ) X สี Texture
สีส่วนมืด = สี ambient X สี texture X สี SSS

ทำให้สามารถปรับสีตัวละครให้เข้ากับฉากได้ตามตัวอย่าง


การลากเส้นไม่ใช่ post effect แต่จะใช้วิธีที่ในบทความกล่าวว่า เป็นวิธีแบบ “ดั้งเดิม” กล่าวคือ

1. ขยายโมเดลขึ้นเล็กน้อย ทำ front face culling (คือตัดโพลิกอนที่หันมาหาเราทิ้ง) แล้ว render สีเข้ม
2. Render สีธรรมดา
3. เอา 2 ไปทับ 1
http://www.4gamer.net/games/216/G021678/20140703095/screenshot.html?num=090


แต่ทางทีมยังมีเพิ่มเติมลูกเล่นเข้าไปด้วย นั่นคือ การใช้ alpha channel ของ vertex color มาช่วยควบคุมความหนาของเส้น

ตามตัวอย่างครับ ซ้ายคือเส้นธรรมดา ขวาคือเส้นที่ใช้เทคนิกนี้



และยังไม่หมดครับ เพื่อซ่อนเส้นในส่วนที่ไม่ต้องการ ทีมงานนำ Blue Channel ของ Vertex color มาใช้ทำ Z off set เพื่อดันเส้นนั้นให้ลึกลงไปใน z buffer ... หรือพูดง่ายๆ ก็คือหลอกดันเส้นเหล่านั้นไปไกลๆ เพื่อให้โมเดลบังเอาไว้นั่นแหละครับ ซึ่งใช้เยอะมากในส่วนเส้นผม

ซ้ายคือปกติ ขวาคือใช้ Z off set

เทคนิกดังกล่าวรับมือเส้นที่วิ่งรอบนอกตัวละคร

ส่วนลายเส้นภายใน ทีมงานจะใช้วิธีวาดลงใน texture เป็นแนวนอนและแนวตั้งเท่านั้น เพื่อไม่ให้เกิดปัญหาเส้นมีรอยหยัก

ตัวอย่าง Texture ลายเส้นของ I-No


จากนั้น ทีมงานสามารถขยับ UV เล็กน้อยเพื่อเล่นกับความหนา-บางของลายเส้นได้ ยกตัวอย่าง UV ของ Sol และผลที่ได้

ถ้าลองโหลด PDF ที่ผมลงไว้ตอนต้นบทความไปดู จะแปลกใจครับที่ Texture ตัวละครแทบทุกตัว วางเป็นตารางๆ แบบนี้หมดเลย ทีแรกเห็นแล้วเล่นเอางง

จบ Part แรกครับ ติดตามต่อ Part 2: Animation และอื่นๆ ได้เลยครับ


Sunday, December 29, 2013

Starlingrad VFX Reel

Show reel ที่ดูแล้วประทับใจที่สุดอันหนึ่ง จากรัสเซียครับ


Main Road|Post "Stalingrad" VFX reel ' 2013 from Arman Yahin on Vimeo.

Wednesday, November 27, 2013

V-ray Exercise - กระดานหมากรุก

เป็นแบบฝึกหัดที่ทำเมื่อปี 2011 ตอนทดลอง V-ray for Maya

ไฟทุกดวงที่ใช้ เป็นไฟวางมือทั้งหมด ประกอบด้วย Spot Light และ V-ray Rec Light ไม่มีการใช้ HDR


Vray lighting excersize from Panupat C on Vimeo.


ภาพต้นฉบับเป็น wallpaper ที่เซฟมาจาก Google

http://hd4desktop.com/27937-chess-board-pieces-widescreen-wooden-alone-vs-dark-hd-wallpaper

Break Down
Chess exercise (2011)
V-ray for Maya, Nuke. All hand placed lights, no HDR

Tuesday, November 26, 2013

ทดสอบ GPU Render Engine

Redshift test.
1920*1080 @ 3 minutes per frame on GTX 770
ช่วงนี้ที่สตูดิโอมีการทดสอบ GPU Render Engine กันอย่างจริงจัง และผมได้มีโอกาสนั่งเล่น Open Beta ของ Redshift ( https://www.redshift3d.com )

ผมชอบ Redshift ตรงที่การใช้งานและไอเดียต่างๆ คล้าย V-ray มาก อีกทั้งผมถูกใจมุมมองและทัศนคติของผู้พัฒนาโปรแกรมนี้ด้วย ยังไม่นับความเร็วในการทำ Raytrace ที่น่าประทับใจมาก

Redshift test.
2K @ 1 minute 12 seconds on GT 640


ข้อเสียก็คือยังไม่สนับสนุน hair, fur, particle และยังมีมีการกระพริบอะไรแปลกๆ บ้าง



Dusty bottles - Redshift early test from Panupat C on Vimeo.


อีกโปรแกรมหนึ่งที่ทางสตูดิโอนำมาทดสอบก็คือ Furryball (http://furryball.aaa-studio.eu )

Furryball ตรงข้ามกับ Redshift พอสมควร เพราะมี workflow ที่ค่อนข้างแปลก ต้องใช้เวลาทำความคุ้นเคย และทำ Raytrace ได้ช้ามาก โดยทดแทนด้วยโหมด Rasterize ซึ่งเร็วมากแต่ลดทอนความถูกต้องลงไป

ข้อได้เปรียบอีกอย่างหนึ่งคือสนับสนุน hair, fur, particle และ fluid ค่อนข้างครบถ้วน


Furryball test by Plankton CG.
1920 * 1080 @ 1 hour 36 minutes on GFX 770

จากการพูดคุยกับทีมจัดแสง มีความคิดเห็นว่าโหมด Rasterize น่าจะเหมาะนำมาใช้กับตัวละครสไตล์การ์ตูน แต่คงไม่เหมาะกับงานที่ต้องการความสมจริงหรือภาพที่ต้องทำ Raytrace หนักๆ เช่น แก้ว หรือกระจก

อีกโปรแกรมหนึ่งที่กลุ่มผู้ใช้ 3D MAX ค่อนข้างตื่นเต้นกันก็คือ Octane Render ( http://www.otoy.com ) ตัวนี้ผมยังไม่มีโอกาสได้ทดสอบ แต่จะหากมีโอกาสคงไม่พลาดแน่นอนครับ