การปรับแสงเงาเพื่อให้ดูดีขึ้น


9

ฉันมีเกมที่เล่นง่ายและหัวเรื่องก็คือเส้นเล็ก ๆ เหล่านี้ มันมีเป้าหมายสำหรับ iOS และ Android ดังนั้นจึงมีโปรเซสเซอร์หลากหลายประเภทที่สามารถทำงานได้ในตอนนี้

ป้อนคำอธิบายรูปภาพที่นี่

ฉันกำลังพยายามเพิ่มแสงแบบเรียลไทม์ให้กับพวกเขาด้วยเหตุผลสองประการ

  1. ฉันพยายามซ่อนความจริงที่ว่าฉันไม่มีเวลาในการเรนเดอร์เพื่อประมวลผล anti-aliasing บนอุปกรณ์ส่วนใหญ่
  2. เรื่องของเกมนั้นควรจะเป็นแสงที่บริสุทธิ์, ดังนั้นรูปที่ควรมีลักษณะเหมือนสิ่งเหล่านั้นเป็นแสงที่บริสุทธิ์

ฉันได้ปรับแต่ง sha blur ที่แยกกันไม่ออกนานแล้วและฉันก็มาถึงจุดที่หงุดหงิดฉันไม่สามารถทำให้มันถูกต้องได้บางทีปัญหาคือฉันพยายามซ่อนขอบขรุขระของแสงอย่างไร้ขอบเขต ในขณะเดียวกันก็ไม่ทำให้แสงเบลอ

ปัญหาที่ใหญ่ที่สุดของฉันคือตัวแปรทั้งหมดที่เกี่ยวข้องในการทำให้มันดูดีที่สุด

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

  • A. เพิ่มโหมดการผสมผสานโหมดการผสมผสานหน้าจอหรือการผสมอื่น ๆ
  • B. น้ำหนักเบลอและปกติแตกต่างกันก่อนที่จะรวมกัน
  • C. ซิกม่าของฟังก์ชั่นกระดิ่งเกาส์ (ฉันใช้ เครื่องคิดเลขที่สับสนนี้แต่ดูเหมือนจะไม่ได้ให้คุณค่าเดียวกับที่ฉันเห็นคนอื่นมีอยู่)
  • D. Scalars สำหรับค่า "x" ที่ส่งไปยังฟังก์ชัน sigma
  • E. ตัวอย่างขนาด (ทำให้รัศมีการเบลอน้อยกว่าหรือใหญ่กว่า)
  • F. การเปลี่ยนความละเอียดของบัฟเฟอร์เรืองแสง

วิธีการหาค่าคงที่ "ดูดีที่สุด" เมื่อทำงานกับตัวแปรมากมายเช่นนี้?

ฉันยังมีปัญหาเพราะเวลาที่ฉันทำการปรับแต่งและการเห็นมันเป็นเวลานานที่มันยากที่จะเห็นการเปลี่ยนแปลงฉันจะทำมันในของเล่น shader แต่ฉันไม่สามารถโหลดภาพนี้หรือสร้างมันขึ้นมาตามขั้นตอนได้

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

คำตอบ:


8

Sigma และขนาดเคอร์เนลของตัวกรอง Gaussian

เกี่ยวกับวิธีการเลือก sigma และขนาดเคอร์เนล (พิกเซล) ของ Gaussian: คุณตั้งค่า sigma ตามความกว้างของความพร่ามัวที่คุณต้องการ มันเป็นเกมของการค้นหาขนาดเคอร์เนลที่จับพอร์กเบล (ไม่มีที่สิ้นสุดทางคณิตศาสตร์) ให้ดูดีในขณะที่ไม่แพงเกินไป

ตามกฎของหัวแม่มือขนาดเคอร์เนลควรมีอย่างน้อย 6 เท่าของซิกม่า จากนั้นเคอร์เนลจะขยายออกเป็น 3 sigmas ในแต่ละทิศทางซึ่งเพียงพอที่จะครอบคลุมน้ำหนักเกือบทั้งหมดของเส้นโค้งระฆังทางคณิตศาสตร์ นอกจากนี้ยังเป็นการดีที่จะปัดเศษขนาดพิกเซลเป็นจำนวนคี่ถัดไปดังนั้นตัวกรองจะสมมาตร ตัวอย่างเช่นด้วย sigma = 1.5 px คุณจะต้องใช้ตัวกรอง 9 พิกเซล ด้วย sigma = 2.0 px ให้ใช้ตัวกรอง 13 พิกเซล ฯลฯ

หรือถ้าคุณมีข้อ จำกัด ด้านประสิทธิภาพที่ควบคุมขนาดเคอร์เนลที่คุณสามารถใช้ได้ให้หารด้วย 6 เพื่อให้ได้ซิกม่าสูงสุดที่คุณสามารถหลีกเลี่ยงได้ (โปรดทราบว่า sigma สามารถเป็นเศษส่วนได้เนื่องจากเป็นเพียงอินพุตของสมการโค้งระฆัง)

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

การสร้างตัวกรองเรืองแสงที่ดูดี

กลอุบายทั่วไปของสิ่งเหล่านี้คือการใช้ Gaussians ที่มีรัศมีแตกต่างกันหลายแบบรวมเข้าด้วยกัน มันทำให้เอฟเฟกต์เรืองแสงดีกว่า Gaussian ใด ๆ ด้วยตัวมันเอง ตัวอย่างเช่นนี่คือการจำลองใน Photoshop ที่สร้างขึ้นด้วยสามชั้นผสมผสานกันอย่างลงตัว Gaussians สามรายการมีขนาด 3px, 5px และ 11px (สอดคล้องกับ sigma = 0.5px, 0.83px, 1.83px ตามลำดับ)

ตัวกรองดอกไม้ที่เยาะเย้ย

คุณยังสามารถเพิ่ม Gaussians ที่ใหญ่ขึ้นเพื่อเพิ่มรัศมีของแสงที่เพิ่มขึ้น นี่คือการใช้เอฟเฟกต์ "Bloom" มาตรฐานในเอ็นจิ้นเกม 3D

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

jaggies

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

ฉันได้ยินมาว่าคุณไม่สามารถใช้ MSAA ด้วยเหตุผลด้านประสิทธิภาพ แต่อาจเป็นตัวเลือกอื่น คุณอาจเพิ่มขนาดของพวกเขาได้เล็กน้อยและเขียน shader ที่ใช้การไล่ระดับสีเพื่อไล่สีให้จางลงภายในพิกเซลสองเท่าของขอบ ที่ควรช่วยให้พวกเขาดูเรียบเนียนขึ้น นี่คือ shadertoyที่แสดงให้เห็นถึง falloff edge กว้าง 1px ที่ใช้สำหรับการลดรอยหยักรูปร่างขั้นตอน


@Nathan_Reed ฉันใช้เคล็ดลับส่วนใหญ่ของคุณยกเว้นแทนที่จะทำ MSAA ซึ่งแปลกมากพอที่จะหลอกลวงได้โดยไม่ตี 2 เท่า หากฉันมีคำถามเกี่ยวกับการเพิ่มไฮไลต์ให้กับเอฟเฟกต์ปัจจุบันฉันควรแก้ไขคำถามหรือสร้างคำถามใหม่หรือไม่?
J.Doe

@ J.Doe ยอดเยี่ยมดีใจที่ได้ยินว่ามันได้ผลจริง! ฉันว่ามันดีกว่าที่จะถามคำถามใหม่เกี่ยวกับการปรับแต่งเอฟเฟกต์ถ้าคุณมีหน้าตาเฉพาะที่คุณต้องการ
นาธานรีด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.