ตูน / cel แรเงาที่มีความกว้างของเส้นตัวแปร?


15

ฉันเห็นแนวทางกว้าง ๆ สองสามข้อเพื่อทำการแรเงา cel:

  1. การทำซ้ำและการขยายรูปแบบด้วยบรรทัดฐานพลิก (ไม่ใช่ตัวเลือกสำหรับฉัน)
  2. Sobel filter / fragment shader เข้าใกล้การตรวจจับขอบ
  3. บัฟเฟอร์ของลายฉลุเข้าหาการตรวจจับขอบ
  4. วิธีการ Shader ของเรขาคณิต (หรือจุดสุดยอด) ที่คำนวณบรรทัดฐานใบหน้าและขอบ

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

ถ้าฉันไม่ต้องการแสงพิกเซลบนพื้นผิวภูมิประเทศของฉันล่ะ (และฉันอาจจะไม่เป็นอย่างที่ฉันวางแผนที่จะใช้แสง / เงาบนพื้นผิวที่ใช้กับเซลล์ / แรปแมป) - ฉันจะดีกว่าหากใช้วิธีเรขาคณิต - หรือดีกว่าสำหรับพื้นที่หน้าจอ / ชิ้นส่วนแทน การทำให้สิ่งต่าง ๆ ง่ายขึ้น? ถ้าเป็นเช่นนั้นฉันจะได้รับ "หมึก" ของเนินเขา ในภาพเงาตาข่ายแทนที่จะเป็นเพียงโครงร่างของตาข่ายทั้งหมด (โดยไม่มีรายละเอียด "หมึก" ภายในโครงร่างนั้น) ( รูปทรงที่มีการชี้นำของ AKA , รอยย่น )

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

สิ่งที่ฉันต้องการ - ความหนาของเส้นที่แตกต่างกับเส้นที่ล่วงล้ำภายในรูปเงาดำ ...

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

สิ่งที่ฉันไม่ต้องการ ...

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


แก้ไข: การวิจัยเพิ่มเติมได้เปิดขึ้นต่อไปนี้ ...

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

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

บัฟเฟอร์ของลายฉลุเป็นสิ่งที่ฉันควรหลีกเลี่ยงเพราะฉันอยากจะทำงานทั้งหมดในเฉดสี (ตัวอย่างข้างต้นที่มีโครงร่างสีแดงทำด้วย stencil buffer - old school)

สิ่งนี้ทำให้วิธีการพื้นที่ภาพส่วนที่แตก ความซับซ้อนในการคำนวณจะลดลงตามจำนวนของชิ้นส่วนแทนที่จะเป็นจำนวนของจุดยอด (ในกรณีของฉันการดำเนินการน้อยกว่า 10-100x น้อยกว่าที่ฉันต้องทำใน shader ทางเรขาคณิต) สิ่งนี้ต้องใช้การเรนเดอร์มากกว่าหนึ่งเพื่อสร้าง g-buffer (ประกอบด้วยบัฟเฟอร์ปกติและเลือกบัฟเฟอร์ความลึกเช่นกัน) ซึ่งเราสามารถใช้ตัวกรองความไม่ต่อเนื่อง (เช่นตัวดำเนินการ Sobel) ความไม่ต่อเนื่องเชิงลึกคือสิ่งที่ช่วยให้รูปทรงและรอยพับที่มีการชี้นำ การเล่นโวหารเพียงอย่างเดียวของฉันด้วยวิธีนี้คือการไม่สามารถควบคุมความกว้างของขอบหมึกได้ดีขึ้นแม้ว่าจะมีอัลกอริทึมที่ถูกต้องในตัวแบ่งส่วนฉันแน่ใจว่าสิ่งนี้จะเป็นไปได้

ดังนั้นตอนนี้คำถามจึงมีความเฉพาะเจาะจงมากขึ้น:ฉันจะไปเกี่ยวกับการรับความกว้างของขอบตัวแปรได้อย่างไรโดยเฉพาะอย่างยิ่งที่ภาพเงาด้านนอกในส่วนที่แตกออก


ความหนาของเส้นที่แปรผันเป็นคุณสมบัติของวิธีการทางเรขาคณิต ไม่สามารถรับอย่างอื่นได้อย่างมีประสิทธิภาพ เนื่องจากคุณต้องการสิ่งนั้นฉันไม่เห็นเงาพิกเซลว่าเป็น "วิธีที่มีประสิทธิภาพมากขึ้น": จำนวนพิกเซลที่จะค้นหา = (line_thickness * 2 + 1) ^ 2 - 1 ซึ่งโดยทั่วไปแล้วจะหมายความว่า shader หลังกระบวนการของคุณ จะมาก (คาดเดา: 10x) ช้ากว่าถ้าสูงสุด ความกว้างของเส้นเท่ากับ 2 เพียงแค่วางการตัดสินล่วงหน้าและลองใช้วิธีการสร้างรูปทรงเรขาคณิต
snake5

@ snake5 คุณแนะนำโดยสุจริตว่าฉันวิ่งผ่านจุดยอด 150 ล้านต่อการอัปเดตการแสดงผล (ประมาณ 25 ล้านด้วยการดูการคัดสรร) ใน GS หรือไม่? ฉันไม่ได้ซื้อมันจริงๆ แต่ขอบคุณสำหรับอินพุต อ้างอิงกลับไปที่สิ่งที่ฉันระบุไว้ข้างต้นเกี่ยวกับจำนวนและความซับซ้อน แม้กับรูป 10x ของคุณชิ้นส่วน shader จะวาดอย่างน้อยและอาจทำให้นรกดีขึ้นมาก
วิศวกร

จุดยอด 25 ล้านจุด (อ่าน / เขียนเชิงเส้น) เปรียบเทียบกับตัวอย่างเนื้อสัมผัส 23 ล้านรายการ (หน่วยความจำแคชค่อนข้างต่ำอ่าน + คลายการบีบอัดข้อมูลเรนเดอร์เป้าหมาย) @ 1280x720 การ จำกัด / ลดจำนวนจุดสุดยอดนั้นง่ายกว่ามาก โดยเฉพาะอย่างยิ่งทุกวันนี้เมื่อจอภาพขนาดใหญ่ (1920x1080 +) และการตั้งค่าตัวรับสัญญาณหลายตัวกำลังได้รับความนิยมอย่างมาก
snake5

สิ่งที่เกี่ยวกับการใช้อัลกอริทึมเดียวกันกับที่สร้างโครงร่างสีแดงแล้วเส้นบาง / เติบโตขึ้นอยู่กับความลึกของพวกเขา?
Ali1S232

@Gajoo ในขณะที่ฉันกำลังพูดถึงคำถามมันไม่ใช่แค่เงา สังเกตเส้นที่ล่วงล้ำหลังไหล่ของหญิงสาวในภาพแรก สิ่งเหล่านี้เป็นฟังก์ชั่นของวิธีการพลิกกลับบรรทัดฐานและทำหน้าที่เป็นรูปทรงที่มีการชี้นำ ฉันต้องการเหมือนกัน
วิศวกร

คำตอบ:


4

ฉันตัดสินใจที่จะใช้ชิ้นส่วน Shader ผ่านการกรองแบบไม่ต่อเนื่องของบัฟเฟอร์ความลึก เหตุผลนี้คือ:

  1. จุดสุดยอดของโลกนั้นสูงมากเนื่องจากระยะทางที่กว้างใหญ่ถึงแม้จะเป็นตาข่าย LoD ก็ตาม
  2. ฉันกำลังดำเนินการกับตัวแบ่งส่วนอื่น ๆ เช่น DoF blur ซึ่งสามารถใช้ประโยชน์จากโครงสร้างเดียวกัน (กล่องหรือการสุ่มตัวอย่าง / การกรองแบบเกาส์) ในการส่งแบบเดียวกัน

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


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

@Grieverheart นี่เป็นคำตอบที่ได้รับการยอมรับเพราะวิธีการที่ฉันใช้นั้นใช้ได้ผลดี ขอบคุณ
วิศวกร

0

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

ฉันคิดค้นอัลกอริทึม toonShader ย้อนกลับไปในปี 2000/2001 แม้กระทั่งก่อนหน้าเพื่อนชาวฝรั่งเศสผู้สร้างโซลูชันนี้ ของฉันขึ้นอยู่กับรูปทรงของวัสดุจริง โดยทั่วไปแล้วมีสองวิธีที่จะทำดังนี้ 1. ดูบรรทัดฐานถ้าบรรทัดฐานสองระนาบที่เชื่อมต่อกับเส้นนั้นหันหน้าเข้าหากล้องหันไปทางเส้นนั้นคุณสามารถใช้ความลึกแสง ฯลฯ เป็นตัวชี้นำสำหรับความลึก 2. ดูที่ geomerty ที่เรนเดอร์ (ดังนั้นหลังจากการแปลงเปอร์สเปคทีฟ) ใช้แต่ละเส้นแบ่งถ้าจุดยอดของระนาบการเชื่อมต่ออยู่ในด้านเดียวกันของเส้นตรงนี้คุณแสดงเส้น .. จากนั้นคุณสามารถทำแบบเดียวกันกับความหนาของเส้น วิธีที่ 1. 3. คุณสามารถผสมผสานเทคนิคทั้งสามนี้ได้ แต่ฉันพูดถึงวิธีแรกเพราะคุณระบุจำนวนโพลีจำนวนมาก

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