จะทำให้วงการเลือกหน่วยผสานได้อย่างไร


16

ฉันต้องการทราบวิธีทำให้ลักษณะพิเศษนี้ของการเลือกแวดวงที่ผสาน นี่คือภาพเพื่อแสดง:

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

โดยทั่วไปฉันกำลังมองหาผลกระทบนี้:

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

วิธีการรวมกลมกลืนของวงกลมสามารถทำได้อย่างไร ฉันไม่พบคำอธิบายใด ๆ เกี่ยวกับผลกระทบนี้ ฉันรู้ว่าเพื่อฉายภาพพื้นผิวเหล่านั้นฉันสามารถพัฒนาระบบรูปลอก แต่ฉันไม่รู้วิธีสร้างเอฟเฟกต์การผสาน

ถ้าเป็นไปได้ฉันกำลังมองหาวิธีแก้ปัญหาอย่างหมดจด


คุณช่วยอธิบายว่า "merge effect" หมายความว่าอะไร?
wondra

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

คุณยืนยันในโซลูชันของ Shader หรือไม่? ถ้าไม่คุณก็แก้ไขมันในภาพสุดท้ายของคุณ
wondra

ภาพหน้าจอล่าสุดแสดงผลที่ฉันกำหนดเป้าหมายเท่านั้น ผลลัพธ์สุดท้ายควรมีลักษณะเหมือนภาพหน้าจอก่อนหน้า
MaT

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

คำตอบ:


8

มีเทคนิคเล็กน้อยที่คุณสามารถทำได้:

Z-บัฟเฟอร์

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

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

ลายฉลุ

เหมือนกับวิธีก่อนหน้า แต่คราวนี้ใช้ stencil buffer แสดงวงกลมขนาดเล็กลงสำหรับหน่วยที่มีค่าลายฉลุแล้วทำการเรนเดอร์สติ๊กเกอร์ตัวเลือก ตั้งค่า stencil เพื่อยกเลิกองค์ประกอบใด ๆ ที่มีค่า stencil ของคุณ


เทคนิค Z-Buffer นั้นน่าสนใจ แต่ฉันไม่เข้าใจว่าวงกลมโปร่งใสแรกสามารถตัดสติ๊กเกอร์พื้นได้อย่างไร
MAT

0

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


1
ฉันคิดว่าคุณได้ข้ามส่วนหนึ่งจากคำตอบของคุณ - ผ่านตำแหน่งวงกลมทั้งหมดและรัศมีไปยัง shader
Kromster พูดว่าสนับสนุนโมนิก้า

@Krom หาก OP แสดงความสนใจในวิธีการแก้ปัญหาใด ๆ ฉันยินดีที่จะให้รายละเอียดเพิ่มเติม
JarkkoL

0

คุณหมายถึงวงกลมสีฟ้าเหล่านั้นบนพื้นหรือไม่?

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

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


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

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

หากคำตอบของฉันเป็นนามธรรมเกินไปโดยโอกาสใด ๆ แจ้งให้เราทราบ


ฉันได้รับความคิดทั่วไป แต่เป็นคุณจะพูดว่ามันเป็นบิตที่เป็นนามธรรมสำหรับผมที่เกี่ยวกับวงการผสาน :)
MAT

0

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

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

ข้อแม้เดียวคือคุณต้องระวังเกี่ยวกับการต่อสู้เชิงลึก คุณสามารถใช้ออฟเซ็ตขนาดเล็กเพื่อให้แน่ใจว่าโครงร่างนั้นอยู่ด้านหลังการตกแต่งภายในและกำจัดโดยการทดสอบความลึก อีกทางเลือกหนึ่งคือการใช้glPolygonOffset()ทางเลือกที่จะใช้

สมมติว่าคุณมีวงกลมสองวงที่ขนานกับระนาบ xy โดยมีศูนย์กลางที่ (x1, y1, z) และ (x2, y2, z) และคุณมีฟังก์ชั่นการวาดเหล่านี้:

// Draw interior part of circle, shown in green in the schematic in the question.
drawInterior(x, y, z);

// Draw outline of circle, shown in red in the schematic in the question.
drawOutline(x, y, z);

ลำดับของการวาดภาพจะมีลักษณะเช่นนี้โดยมีdeltaการชดเชยเล็กน้อย:

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
drawInterior(x1, y1, z + delta);
drawInterior(x2, y2, z + delta);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
drawOutline(x1, y1, z);
drawOutline(x2, y2, z);

0

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


ใช่ฉันคิดเกี่ยวกับเรื่องนั้นด้วย :) แต่อย่างที่คุณบอกว่ามันไม่ใช่ทางออกที่ดีและเป็นโซลูชันที่ไม่ธรรมดามาก แต่ขอบคุณ !
MaT

นั่นเป็นคำอธิบายที่คลุมเครือ
Kromster กล่าวว่าสนับสนุน Monica

0

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

ในขณะที่วิธีแก้ปัญหาที่ฉันมีสำหรับการวาดโครงร่างตรงนี้เป็นมากกว่าที่คุณต้องการ (เนื่องจาก shader เปลี่ยนทุกส่วนของเส้นขอบให้เป็นรูปสี่เหลี่ยมเต็มรูปแบบ) แต่ก็ทำตามวิธีการนี้: การวาดรูปแบบดั้งเดิมไปยัง stencil buffer บัฟเฟอร์ stencil ยังคงเป็น 0


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

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

อืมถ้างั้นการมีภาพขาวดำเพื่อเขียนไปยัง stencil buffer ในรอบแรกเพื่อให้สีดำกลายเป็น 0 และสีขาวกลายเป็น 1 ใน stencil เป็นไปได้ไหม
Doodlemeat

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