พื้นผิว

ทำตามแนวทางปฏิบัติแนะนำต่อไปนี้เพื่อเพิ่มประสิทธิภาพลักษณะที่ปรากฏและประสิทธิภาพของ เท็กซ์เจอร์ในเกม Android

พื้นผิวเป็นองค์ประกอบหลักของอาร์ตเวิร์ก 3 มิติ เกม 3 มิติที่ทำงานได้ดีใน อุปกรณ์จำนวนมากที่สุดเริ่มต้นด้วยอาร์ตเวิร์ก 3 มิติที่ออกแบบมาเพื่อใช้ ประโยชน์จากหน่วยประมวลผลกราฟิกให้ได้มากที่สุด คู่มือนี้จะเน้นการเพิ่มประสิทธิภาพและแนวทางปฏิบัติแนะนำสำหรับพื้นผิวบนอุปกรณ์เคลื่อนที่เพื่อให้เกมทำงานได้ดีขึ้นและลดการใช้พลังงานในขณะที่ยังคงคุณภาพของภาพไว้สูง

เนื้อหาบางส่วนของบทความนี้อิงตามผลงานที่ Arm Limited เป็นผู้มีส่วนร่วมและเป็นเจ้าของลิขสิทธิ์

สร้าง Texture Atlas

Texture Atlas คือพื้นผิวที่ออกแบบมาเพื่อจัดเก็บข้อมูลรูปภาพของออบเจ็กต์กราฟิกหลายรายการ เช่น Mesh 3 มิติหรือ Sprite 2 มิติ แทนที่จะให้แต่ละออบเจ็กต์มีเท็กซ์เจอร์ของตัวเอง ระบบจะใช้เท็กซ์เจอร์แอตลาสเพื่อรวมรูปภาพจากแต่ละออบเจ็กต์

Mesh ที่ใช้แอตลาสพื้นผิวร่วมกัน
รูปที่ 1 ไฮไลต์สีเหลืองในฉากที่เรนเดอร์ (ซ้าย) จะแสดงโครงร่างของตาข่ายที่ใช้แอตลาสพื้นผิวร่วมกัน (ขวา)

การลดจำนวนการเรียกวาดของเฟรมเกมเป็นองค์ประกอบสำคัญในการ บรรลุประสิทธิภาพการแสดงผลที่เหมาะสม การใช้พื้นผิวเดียวกันสำหรับออบเจ็กต์ต่างๆ เป็นปัจจัยหนึ่งในการรวมออบเจ็กต์เหล่านั้นไว้ในการเรียกใช้การวาดภาพครั้งเดียว การลด Draw Call เป็นสิ่งสำคัญอย่างยิ่งสำหรับเกมที่ขึ้นอยู่กับ CPU เนื่องจาก Draw Call แต่ละรายการจะทำให้เกิดค่าใช้จ่ายเพิ่มเติมของ CPU เมื่อไดรเวอร์กราฟิกประมวลผล นอกจากนี้ เท็กซ์เจอร์แอตลาสยังช่วยลดจำนวนไฟล์ชิ้นงานเท็กซ์เจอร์ในข้อมูลรันไทม์ของเกมด้วย รวมพื้นผิวหลายร้อยหรือหลายพันรายการไว้ในไฟล์ Texture Atlas จำนวนน้อยลงมาก

คุณควรวางแผนเลย์เอาต์ของ Texture Atlas เมื่อสร้างเมช 3 มิติ หากสร้าง Atlas ก่อนสร้างชิ้นงานตาข่าย ชิ้นงานตาข่ายจะต้อง UV ที่คลี่ตาม Texture Atlas หากสร้าง Atlas หลังจากเขียน โดยใช้เครื่องมือผสานหรือสร้าง Atlas ในซอฟต์แวร์วาดภาพ คุณจะต้อง จัดเรียงเกาะ UV ใหม่ตามพื้นผิว

การจัดกลุ่มคำสั่งประมวลผลเฉพาะเครื่องมือ

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

Unreal Engine 4 ต้องตั้งค่าด้วยตนเองสำหรับการประมวลผลแบบกลุ่ม คุณสามารถผสานออบเจ็กต์ในซอฟต์แวร์ 3 มิติ ก่อนที่จะนำเข้าไปยัง Unreal Unreal ยังมีเครื่องมือ การผสาน Actor ของ UE4 ซึ่งสามารถรวม Mesh และสร้างไฟล์ Texture Atlas ได้

สร้าง Mipmap

Mipmap คือเวอร์ชันที่มีความละเอียดต่ำกว่าของพื้นผิว คอลเล็กชันของ MIPmap สำหรับ เท็กซ์เจอร์ที่กำหนดเรียกว่าเชน MIPmap Mipmap แต่ละระดับถัดไปใน เชนมีความละเอียดต่ำกว่าระดับก่อนหน้า Mipmap ใช้เพื่อ ใช้ LOD (ระดับรายละเอียด) ของพื้นผิวในระหว่างการแสดงผล เมื่อเชื่อมโยงเท็กซ์เจอร์ที่สร้าง MIP กับสเตจของเท็กซ์เจอร์ ฮาร์ดแวร์กราฟิกจะใช้พื้นที่เท็กซ์เจอร์ ที่ใช้โดย Fragment เพื่อเลือกระดับจากห่วงโซ่ MIP เมื่อ เรนเดอร์ฉาก 3 มิติ วัตถุที่อยู่ไกลจากกล้องจะใช้ Mipmap ที่มีความละเอียดต่ำกว่าวัตถุเดียวกันที่อยู่ใกล้กล้อง

พื้นผิวที่ใช้ MIP Mapping จะใช้หน่วยความจำมากกว่าพื้นผิวที่ไม่ได้ใช้ MIP Mapping ระดับ MIPMAP เพิ่มเติมจะเพิ่มปริมาณหน่วยความจำของเท็กซ์เจอร์ขึ้น 33% หากวาด เท็กซ์เจอร์ที่ระยะห่างคงที่จากกล้อง การสร้าง MIPMAP จะเป็นการ ใช้หน่วยความจำโดยไม่จำเป็น

เชน MIPmap จากความละเอียดของพื้นผิวฐานที่ 512x512 พิกเซล
รูปที่ 2 ห่วงโซ่ MIPMAP ความละเอียดพื้นฐานของพื้นผิวคือ 512x512 พิกเซล

การใช้ MIP map อย่างถูกต้องจะช่วยปรับปรุงประสิทธิภาพของ GPU ความพร้อมใช้งานของระดับ MIPMAP ที่มีความละเอียดต่ำกว่า จะช่วยลดการใช้งานแบนด์วิดท์ของหน่วยความจำและปรับปรุงการคงอยู่ของแคชพื้นผิว

นอกจากนี้ Mipmapping ยังช่วยปรับปรุงคุณภาพของภาพด้วยการลดการเหลื่อมของพื้นผิวได้อีกด้วย คุณจะเห็นการเกิดรอยหยักของพื้นผิวเป็นเอฟเฟกต์การกะพริบบนพื้นที่ที่อยู่ไกลจากกล้อง

ตัวอย่างการเกิดรอยหยักของพื้นผิว
รูปที่ 3 ตัวอย่างการเกิดรอยหยักของพื้นผิว รูปภาพหนึ่งแสดงผลโดยไม่มี MIPmap (ซ้าย) ส่วนอีกรูปภาพแสดงผลโดยมี MIPmap (ขวา) คุณจะเห็นรอยหยักของพื้นผิวภายในสี่เหลี่ยมผืนผ้าสีแดงในรูปภาพด้านซ้าย

รายละเอียด Mipmap เฉพาะเครื่องยนต์

Unreal Engine 4 กำหนดให้ขนาดของพื้นผิวต้องเป็นเลขยกกำลังของ 2 (เช่น 512x1024, 128x128) จึงจะใช้ Mipmapping ได้ ระบบจะไม่สร้างเชน Mipmap หากมิติข้อมูลของพื้นผิวอย่างใดอย่างหนึ่ง หรือทั้ง 2 อย่างไม่ใช่เลขยกกำลังของ 2

เอนจิน Unity จะปรับขนาดเท็กซ์เจอร์ที่มีขนาดที่ไม่ใช่กำลังสองโดยอัตโนมัติเพื่อสร้าง MIP Map ตรวจสอบว่าไฟล์เท็กซ์เจอร์ต้นฉบับมีขนาดเป็นกำลังสองเพื่อหลีกเลี่ยงการปรับขนาดนี้

เลือกโหมดการกรองพื้นผิวที่เหมาะสม

การกรองพื้นผิวเป็นฟีเจอร์การแสดงผลของฮาร์ดแวร์ที่ส่งผลต่อลักษณะที่ปรากฏ ของภาพสามเหลี่ยมที่แสดงผล การใช้การกรองเท็กซ์เจอร์อย่างเหมาะสมจะช่วยปรับปรุง คุณภาพของภาพในฉาก โหมดการกรองเท็กซ์เจอร์มีหลายโหมด โดยแต่ละโหมด จะมีความสมดุลระหว่างการปรับปรุงการแสดงผลกับต้นทุนที่แตกต่างกัน ค่าใช้จ่ายรวม ทั้งเวลาในการคำนวณและแบนด์วิดท์ของหน่วยความจำ โหมดการกรองเท็กซ์เจอร์ที่ใช้กันโดยทั่วไป 3 โหมด ได้แก่ ใกล้ที่สุด (หรือจุด), ไบลิเนียร์ และไตรลิเนียร์ แอนไอโซทรอปิกเป็น วิธีการกรองพื้นผิวเพิ่มเติมที่ใช้ร่วมกับการกรองแบบไบลิเนียร์หรือ ไตรลิเนียร์ได้

ใกล้ที่สุด

Nearest เป็นโหมดการกรองพื้นผิวที่ง่ายที่สุดและมีราคาถูกที่สุด Nearest จะสุ่มตัวอย่างเท็กเซลเดียวโดยใช้พิกัดที่ระบุในเท็กซ์เจอร์ต้นทาง สามเหลี่ยมที่แสดงผลด้วย "ใกล้ที่สุด" จะมีลักษณะเป็นบล็อกหรือเป็นพิกเซล โดยเฉพาะเมื่อแสดงผลใกล้กับกล้อง

ไบลิเนียร์

การกรองแบบไบลิเนียร์จะสุ่มตัวอย่างเท็กเซล 4 ตัวที่อยู่รอบๆ พิกัดที่ระบุ ในเท็กซ์เจอร์ต้นทาง ระบบจะหาค่าเฉลี่ยของเทกเซลทั้ง 4 นี้เพื่อกำหนดสีของเท็กซ์เจอร์ สำหรับเศษ การกรองแบบ Bilinear จะทำให้การไล่ระดับสีระหว่างพิกเซลราบรื่นขึ้น และหลีกเลี่ยงลักษณะเป็นบล็อกของการกรองที่ใกล้ที่สุด สามเหลี่ยม ที่แสดงใกล้กล้องจะเบลอแทนที่จะเป็นพิกเซล Bilinear มีค่าใช้จ่ายมากกว่า Nearest เนื่องจากมีการสุ่มตัวอย่างเท็กเซลเพิ่มเติมและการหาค่าเฉลี่ย

การเปรียบเทียบระหว่างการกรองแบบใกล้ที่สุดกับการกรองแบบไบลิเนียร์
รูปที่ 4 การเปรียบเทียบการกรองพื้นผิวแบบใกล้ที่สุด (ซ้าย) และแบบไบลิเนียร์ (ขวา)

Trilinear

เมื่อเรนเดอร์ตาข่ายที่ระยะห่างของจุดยอดจากกล้อง แตกต่างกัน ระบบอาจเลือกหลายระดับของ Mipmap ในระหว่างการเรนเดอร์ การเปลี่ยนแปลง ระหว่างระดับมิปแมป 2 ระดับอาจทำให้เกิดรอยตัดที่คมชัดอย่างเห็นได้ชัด ณ จุดเปลี่ยน การกรองแบบไตรเชิงเส้นจะลดความคมชัดของการเปลี่ยนภาพเหล่านี้โดยทำการกรองแบบไบลิเนียร์ ในระดับ MIPMAP ที่แตกต่างกัน 2 ระดับและประมาณค่าผลลัพธ์ การใช้ ระดับ MIP หลายระดับและการประมาณค่าทำให้ไตรลิเนียร์มีค่าใช้จ่ายในการคำนวณ มากกว่าไบลิเนียร์

การเปรียบเทียบการกรองแบบ Bilinear กับ Trilinear
รูปที่ 5 การเปรียบเทียบการกรองเท็กซ์เจอร์แบบไบลิเนียร์ (ซ้าย) และไตรลิเนียร์ (ขวา) ภูมิภาคที่ซูมจะแสดงความแตกต่างในการแสดงผลตามการเปลี่ยนผ่านของ MIPMAP

แอนไอโซทรอปิก

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

การเปรียบเทียบการกรองแบบแอนไอโซทรอปิก 1x กับ 2x
รูปที่ 6 การเปรียบเทียบการกรองแบบไบลิเนียร์/แอนไอโซทรอปิก 1x (ซ้าย) กับการกรองแบบไบลิเนียร์/แอนไอโซทรอปิก 2x (ขวา)

กลยุทธ์การเลือกโหมด

โดยทั่วไปแล้ว การกรองแบบไบลิเนียร์เป็นวิธีที่สมดุลที่สุดระหว่างประสิทธิภาพและคุณภาพของภาพ การกรองแบบไตรเชิงเส้นต้องใช้แบนด์วิดท์หน่วยความจำมากกว่าอย่างมากและ ควรใช้เฉพาะบางรายการ ในหลายกรณี การกรองแบบไบลิเนียร์ร่วมกับการกรองแบบแอนไอโซทรอปิก 2 เท่าจะดูและทำงานได้ดีกว่าการกรองแบบไตรลิเนียร์ที่มีการกรองแบบแอนไอโซทรอปิก 1 เท่า การเพิ่มระดับ Anisotropic ให้เกิน 2 เท่ามีต้นทุนสูงมาก และควรทำอย่างระมัดระวังสำหรับชิ้นงานเกมที่สำคัญ

การกรองพื้นผิวอาจคิดเป็นพลังงาน GPU ทั้งหมดได้ถึงครึ่งหนึ่ง การเลือกตัวกรองพื้นผิวที่ง่ายกว่าเมื่อเป็นไปได้จึงเป็นวิธีที่ยอดเยี่ยม ในการลดความต้องการพลังงานของเกม

เพิ่มประสิทธิภาพขนาดพื้นผิว

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

เมื่อแสดงผล Mesh ที่ใช้พื้นผิวหลายรายการในวัสดุ ให้พิจารณา ลดความละเอียดของพื้นผิวบางรายการอย่างเลือกสรร เช่น เมื่อใช้ เท็กซ์เจอร์แบบกระจายขนาด 1024x1024 คุณอาจลดเท็กซ์เจอร์แผนที่ความหยาบหรือโลหะเป็น 512x512 ได้โดยมีผลกระทบต่อคุณภาพของรูปภาพน้อยที่สุด ตรวจสอบผลลัพธ์ของการทดสอบการปรับขนาดทั้งหมดดังกล่าวเพื่อให้แน่ใจว่าการทดสอบจะไม่ลดทอนระดับคุณภาพที่ต้องการ

ใช้ Color Space ที่เหมาะสม

แพ็กเกจซอฟต์แวร์หลายรายการที่ใช้ในการสร้างพื้นผิวจะทำงานและส่งออกโดยใช้ พื้นที่สี sRGB พื้นผิวแบบกระจายซึ่งประมวลผลเป็นสีอาจใช้พื้นที่สี sRGB ไม่ควรส่งออกพื้นผิวที่ไม่ได้ประมวลผลเป็นสี เช่น แผนที่โลหะ ความหยาบ หรือแผนที่ปกติ ในพื้นที่สี sRGB

การตั้งค่าพื้นผิวของเกมเอนจินมีพารามิเตอร์ที่ระบุว่าพื้นผิวใช้พื้นที่สี sRGB หรือไม่

การตั้งค่าพื้นผิว sRGB ใน Unity และ Unreal Engine 4
รูปที่ 7 การตั้งค่าพื้นผิว sRGB ใน Unity (ซ้าย) และ Unreal Engine 4 (ขวา)

เนื่องจากระบบไม่ได้ใช้ข้อมูลพิกเซลของพื้นผิวดังกล่าวเป็นข้อมูลสี การใช้พื้นที่สี sRGB จึงทำให้ภาพที่ได้ไม่ถูกต้อง

การแสดงผลชายที่มีความหยาบและเป็นโลหะในพื้นที่สีเชิงเส้นเทียบกับ sRGB
รูปที่ 8 แผนที่ความหยาบโลหะเชิงเส้น (ไม่ใช่ sRGB) (ซ้าย) และแผนที่ความหยาบโลหะ sRGB (ขวา) เงาทางด้านขวาดูไม่ถูกต้อง

ใช้การบีบอัดพื้นผิว

การบีบอัดเท็กซ์เจอร์คืออัลกอริทึมการบีบอัดรูปภาพที่ใช้กับข้อมูลพิกเซลที่ไม่ได้บีบอัด ซึ่งส่งผลให้เกิดเท็กซ์เจอร์ที่ฮาร์ดแวร์กราฟิกสามารถคลายการบีบอัดได้อย่างรวดเร็วในระหว่างการแสดงผล การใช้การบีบอัดพื้นผิวอย่างมีประสิทธิภาพจะช่วย ลดการใช้หน่วยความจำและเพิ่มประสิทธิภาพโดยมีผลกระทบต่อคุณภาพ ของภาพน้อยที่สุด อัลกอริทึมการบีบอัดพื้นผิวที่พบบ่อยที่สุด 3 รายการใน Android ได้แก่ ETC1, ETC2 และ ASTC สำหรับเกมสมัยใหม่ โดยทั่วไป ASTC เป็นตัวเลือกหลักที่ดีที่สุด โดยมี ETC2 เป็นตัวเลือกสำรองหากเกมของคุณกำหนดเป้าหมายเป็นอุปกรณ์ที่ไม่รองรับ ASTC

ETC1

อุปกรณ์ Android ทุกรุ่นรองรับ ETC1 ETC1 รองรับเฉพาะโหมด 4 บิตเดียว ต่อพิกเซลของข้อมูลสี RGB ETC1 ไม่รองรับช่องอัลฟ่า เอนจินเกมหลายตัวที่รองรับ ETC1 อนุญาตให้กำหนดเท็กซ์เจอร์ ETC1 ที่ 2 เพื่อใช้แสดงข้อมูลช่องอัลฟ่า

ETC2

อุปกรณ์ Android ที่ใช้งานอยู่กว่า 90% รองรับ ETC2 อุปกรณ์รุ่นเก่ามากซึ่งไม่รองรับ API ของ OpenGL ES 3.0 จะใช้ ETC2 ไม่ได้ ETC2 มีฟีเจอร์เพิ่มเติมจาก ETC1 ดังนี้

  • รองรับช่องอัลฟ่า ทั้งแบบ 8 บิตและแบบ "ทะลุผ่าน" บิตเดียว
  • เวอร์ชัน sRGB ของพื้นผิว RGB และ RGBA
  • พื้นผิวแบบ 1 และ 2 ช่อง, R11 และ RG11

ASTC

อุปกรณ์ Android ที่ใช้งานอยู่กว่า 75% รองรับ ASTC ASTC มีขนาดบล็อกการบีบอัดที่กำหนดค่าได้ ซึ่งช่วยให้คุณควบคุมได้อย่างละเอียดเพื่อปรับสมดุลอัตราส่วนการบีบอัดกับคุณภาพของรูปภาพสำหรับพื้นผิวที่กำหนด ASTC มักจะ ให้คุณภาพที่เหนือกว่าเมื่อใช้หน่วยความจำขนาดเดียวกับ ETC2 หรือ ให้คุณภาพที่คล้ายกันเมื่อใช้หน่วยความจำขนาดเล็กกว่า ETC2

การเปรียบเทียบรูปแบบการบีบอัดพื้นผิวด้วยภาพโดยใช้รูปภาพต้นฉบับเดียวกัน
รูปที่ 9 การเปรียบเทียบระหว่างรูปภาพที่ไม่ได้บีบอัด (ซ้าย ขนาด 17 MB), บีบอัดด้วย ETC1 (ตรงกลาง ขนาด 3 MB) และบีบอัดด้วย ASTC (ขวา ขนาด 2.5 MB)

ความเร็วในการบีบอัดพื้นผิว

การบีบอัดพื้นผิวอาจใช้เวลานานหากเกมมีพื้นผิวจำนวนมาก ทั้ง ETC และ ASTC มีการตั้งค่าคุณภาพการบีบอัดที่เลือกได้ การตั้งค่าคุณภาพสูง ต้องใช้เวลาในการบีบอัดนานขึ้น ในระหว่างการพัฒนา คุณอาจต้องการ ลดระดับคุณภาพเพื่อลดเวลาการบีบอัดและเพิ่มระดับคุณภาพ ก่อนสร้างบิลด์ที่สำคัญ

การบีบอัดพื้นผิวในเกมเอนจิน

หากใช้เอนจินเกม คุณอาจต้องเลือกรูปแบบการบีบอัดพื้นผิว (ETC หรือ ASTC) ที่ระดับโปรเจ็กต์ หากต้องการรองรับรูปแบบการบีบอัดหลายรูปแบบ เพื่อให้มีความเข้ากันได้สูงสุด คุณอาจต้องดำเนินการเพิ่มเติม ฟีเจอร์การกำหนดเป้าหมายรูปแบบการบีบอัด Texture ของการนำส่งชิ้นงานของ Google Play ช่วยให้คุณรวมหลายรูปแบบไว้ในเกม และนำส่งเฉพาะรูปแบบที่เหมาะสมที่สุดไปยังอุปกรณ์แต่ละเครื่องในเวลาที่ติดตั้งได้

แยก UV

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

  • การจัดแพ็กเกจ UV Island ทำได้ง่ายขึ้น ทำให้เหลือพื้นที่ว่างน้อยลง
  • UV แบบตรงจะช่วยลด "เอฟเฟกต์ขั้นบันได" ในพื้นผิว
  • การจัดแพ็กเกจ UV ที่ดีจะช่วยให้ได้ความละเอียดที่เหมาะสมจากพื้นผิว
  • การลงพื้นผิวคุณภาพดีขึ้น แม้ว่า UV จะบิดเบี้ยวเล็กน้อยจากการปรับให้ตรง
เกาะ UV ที่ไม่ได้เพิ่มประสิทธิภาพเทียบกับเกาะ UV ที่เพิ่มประสิทธิภาพแล้ว
รูปที่ 10 เกาะ UV ที่ไม่ได้เพิ่มประสิทธิภาพ (ซ้าย) และเกาะ UV ที่ยืด/คลี่ออก (ขวา)

รอยต่อของพื้นผิวที่มองเห็นได้บนโมเดลดูไม่ดี พยายามวางรอยต่อ UV ในตำแหน่ง ที่มองเห็นได้น้อย หากต้องการช่วยสร้างนอร์มัลแมปที่ดีขึ้น ให้แยกเกาะ UV ในบริเวณที่ขอบคม และเว้นที่ว่างรอบเกาะ

หลีกเลี่ยงรายละเอียดที่มองไม่เห็น

เมื่อสร้างอาร์ตเวิร์ก อย่าเพิ่มรายละเอียดที่มองไม่เห็น โดยเฉพาะในเกมที่ออกแบบมาสำหรับอุปกรณ์ที่มีหน้าจอขนาดเล็ก การสร้างเท็กซ์เจอร์ขนาด 4096x4096 ที่มีรายละเอียดซับซ้อน จะสูญเปล่าเมื่อใช้กับโมเดลเก้าอี้ขนาดเล็กที่แทบจะมองไม่เห็นใน มุมห้อง ในบางกรณี คุณอาจต้องเน้นขอบ (เพิ่มไฮไลต์พิเศษ) และการแรเงาเพื่อปรับปรุงการรับรู้รูปร่าง

ใช้พื้นผิวขนาดเล็กกับโมเดลที่แสดงผลในระยะไกล
รูปที่ 11 ใช้พื้นผิวขนาดเล็ก 256x256 ที่ไม่มีรายละเอียดมากเกินไปในโมเดลทหารที่แสดงผลในระยะไกล

รายละเอียดการอบ

อุปกรณ์เคลื่อนที่มีหน้าจอขนาดเล็กและฮาร์ดแวร์กราฟิกที่มีประสิทธิภาพน้อยกว่า คอมพิวเตอร์ส่วนบุคคลหรือคอนโซลเกม แทนที่จะคำนวณเอฟเฟกต์ต่างๆ เช่น การปิดกั้นแสงโดยรอบหรือการไฮไลต์แบบกระจกเงาในรันไทม์ ให้พิจารณา "อบ" เอฟเฟกต์เหล่านั้น ลงในเท็กซ์เจอร์แบบกระจายแสงเมื่อเป็นไปได้ ซึ่งจะช่วยเพิ่มประสิทธิภาพและรับประกัน การมองเห็นรายละเอียดของคุณ

การฝังไฮไลต์และการบดบังโดยรอบลงในเท็กซ์เจอร์แบบกระจาย
รูปที่ 12 ไฮไลต์และแสงเงาโดยรอบที่ฝังอยู่ในพื้นผิวแบบกระจาย (ซ้าย) และเรนเดอร์ในเกม (ขวา)

ใช้การปรับสมดุลสีเขียว-แดง

หากคุณมีความสามารถในการสร้าง Shader ที่กำหนดเองและมี Mesh ที่มี รูปแบบสีที่คล้ายกันหรือสม่ำเสมอ ให้ลองใช้การปรับสีกับ Mesh ที่เกี่ยวข้อง การปรับสีจะใช้พื้นผิวระดับสีเทา ซึ่งใช้หน่วยความจำของพื้นผิวน้อยกว่าพื้นผิว RGB Shader จะใช้ข้อมูลสีต่อจุดยอดเพื่อใส่สีให้กับตาข่าย อีกวิธีในการปรับสีคือการใช้มาสก์ RGB และใช้พื้นผิวตามช่วงสีของมาสก์

พื้นผิวระดับสีเทาที่ปรับสีในขณะรันไทม์
รูปที่ 13 พื้นผิวระดับสีเทา (ซ้าย) ที่มีการปรับสีขณะรันไทม์สำหรับโมเดลเสา (ขวา)

ช่องพื้นผิวของแพ็ก

เมื่อแสดงผลวัสดุที่มีพื้นผิวหลายรายการ ให้มองหาโอกาสในการ รวมพื้นผิวที่ใช้เฉพาะช่องสีเดียวเป็นพื้นผิวเดียวที่ ใช้ช่องสีทั้ง 3 ช่อง ซึ่งจะช่วยลดการใช้หน่วยความจำและลด จำนวนการดำเนินการของตัวอย่างพื้นผิวที่ดำเนินการโดย Fragment Shader

รวมพื้นผิวแบบช่องทางเดียว 3 รายการเป็นพื้นผิวแบบหลายช่องทาง 1 รายการ
รูปที่ 14 รวมพื้นผิวแบบช่องเดียว 3 รายการ (ซ้าย) เป็นพื้นผิวแบบหลายช่องรายการเดียว (ขวา) ระบบจะกำหนดข้อมูลการบดบังโดยรอบเป็นสีแดง แผนที่ความหยาบ/ความเรียบเป็นสีเขียว และแผนที่โลหะเป็นสีน้ำเงิน

เมื่อแพ็ก ให้กำหนดข้อมูลที่มีรายละเอียดมากที่สุดให้กับช่องสีเขียว เนื่องจาก ดวงตาของมนุษย์ไวต่อสีเขียวมากกว่า ฮาร์ดแวร์กราฟิกจึงมักกำหนดบิตให้กับช่องสีเขียวมากกว่า ตัวอย่างเช่น โดยปกติแล้วแผนที่ความหยาบ/ความเรียบจะ มีรายละเอียดมากกว่าแผนที่โลหะ และเป็นตัวเลือกที่ดีกว่าในการกำหนดให้กับ ช่องสีเขียว

สำหรับวัสดุที่ใช้ Alpha Channel หากคุณใช้เพียง 2 Channel ในเท็กซ์เจอร์ที่แพ็กไว้ ให้พิจารณาใส่ข้อมูล Alpha Channel ลงในเท็กซ์เจอร์ที่แพ็กไว้แทนเท็กซ์เจอร์แบบกระจาย การทำเช่นนี้จะช่วยลดขนาดหรือเพิ่มคุณภาพของภาพของเท็กซ์เจอร์แบบกระจายแสงได้โดยการละเว้นข้อมูลช่องอัลฟ่า ทั้งนี้ขึ้นอยู่กับรูปแบบของเท็กซ์เจอร์แบบกระจายแสง

ช่องอัลฟ่าที่รวมอยู่ในพื้นผิวอื่น
รูปที่ 15 ระบบจะรวมแผนที่ความทึบของช่องอัลฟ่าไว้ในพื้นผิวพร้อมกับแผนที่ความหยาบ/ความเรียบและแผนที่โลหะ

ตรวจสอบว่าได้ตั้งค่าพื้นผิวที่แพ็กไว้เป็นพื้นที่สี RGB เชิงเส้น ไม่ใช่ sRGB

สร้างแผนที่ปกติ

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

โมเดลที่แสดงผลโดยมีและไม่มีแผนที่ปกติ
รูปที่ 16 โมเดลที่แสดงผลโดยไม่มีแผนที่ปกติ (ซ้าย) และโมเดลเดียวกันที่แสดงผลโดยมีแผนที่ปกติ (ตรงกลาง) และพื้นผิวแผนที่ปกติ (ขวา)

โดยทั่วไปแล้ว Normal Map จะมีผลต่อประสิทธิภาพอยู่บ้างและควรใช้เท่าที่จำเป็นในอุปกรณ์ระดับล่าง Normal Map ต้องใช้พื้นผิวเพิ่มเติม ซึ่งส่งผลให้มีการสุ่มตัวอย่างพื้นผิวและการคำนวณ Fragment Shader เพิ่มเติม

แนวทางปฏิบัติแนะนำสำหรับแผนที่ปกติ

แนวทางปฏิบัติแนะนำสำหรับการสร้างแผนที่ปกติมีดังนี้

ใช้กรง

กรงคือโมเดลแบบหลายเหลี่ยมต่ำเวอร์ชันที่ใหญ่ขึ้นหรือขยายออก โดยจะต้องครอบคลุมโมเดลแบบหลายเหลี่ยมสูงเพื่อให้ทำงานได้ดีในระหว่างการสร้าง Normal Map โดย กรงจะใช้เพื่อจำกัดระยะทางของ Raycast ในระหว่างการอบแผนที่ปกติ และช่วยหลีกเลี่ยง ปัญหาเกี่ยวกับรอยต่อปกติที่แยกกันในแผนที่ปกติ

กรงที่ล้อมรอบตาข่ายรูปหลายเหลี่ยมต่ำ
รูปที่ 17 กรงที่ล้อมรอบตาข่ายรูปหลายเหลี่ยมที่มีจำนวนน้อย
โมเดลที่แสดงผลโดยใช้แผนที่ปกติที่มีและไม่มีกรง
รูปที่ 18 การแสดงผลโมเดลโดยใช้แผนที่ปกติที่สร้างด้วยกรง (ซ้าย) เทียบกับโมเดลที่แสดงผลโดยใช้แผนที่ปกติที่สร้างโดยไม่มีกรง (ขวา)

อบการจับคู่ตามชื่อตาข่าย

หากซอฟต์แวร์การอบรองรับ ให้อบการจับคู่ตามชื่อตาข่าย ฟีเจอร์นี้ ช่วยลดปัญหาการฉายภาพแผนที่ปกติที่ไม่ถูกต้อง เมื่อวัตถุอยู่ใกล้กันมากเกินไป วัตถุอาจฉายแผนที่ปกติไปยังพื้นผิวที่ไม่ถูกต้องโดยไม่คาดคิด การจับคู่ตามชื่อตาข่ายช่วยให้มั่นใจได้ว่าการอบจะทำบนพื้นผิวที่ถูกต้องเท่านั้น ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์นี้ใน Substance Painter ได้ที่หน้านี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์นี้ใน Marmoset Toolbag ได้ที่หน้านี้

แยกชิ้นส่วนโมเดล

หากจับคู่ตามชื่อตาข่ายไม่ได้เมื่อทำการเบรก ให้ลองแยกตาข่าย การแยกชิ้นส่วนของตาข่ายจะย้ายชิ้นส่วนต่างๆ ออกจากกันเพื่อไม่ให้ Normal Map ฉายไปยังพื้นผิวที่ไม่ถูกต้อง หากคุณอบสำหรับ Ambient Occlusion ด้วย คุณอาจต้องอบแยกต่างหากโดยใช้เมชที่ยังไม่ระเบิด

เมชที่แยกชิ้นส่วนสำหรับการอบแผนที่ปกติ
รูปที่ 19 การแยกชิ้นส่วนโมเดลสำหรับการอบแผนที่ปกติ

ลดรอยต่อ

UV ต่อเนื่องบนขอบแข็งจะทำให้เกิดรอยต่อที่มองเห็นได้ ให้แยก UV บนขอบแข็งเพื่อ ลดผลกระทบนี้ เมื่อตั้งค่ากลุ่มการสมูท หลักการทั่วไปคือให้ มุมน้อยกว่า 90 องศา รอยต่อ UV ต้องมีกลุ่มการสมูทที่แตกต่างกันในสามเหลี่ยม