ความเหมาะสมของหมอกบนพื้นโดยใช้อัลฟ่าสี่ชั้น?


16

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

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

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

หนึ่งคำถามใหญ่คือเกี่ยวกับลักษณะพิเศษนี้:

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

(เครดิตรูปภาพไปที่ Lume of lume.com)

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


1
ทำไมคุณต้องการใช้เลเยอร์อัลฟ่า Quad สำหรับสิ่งนี้ "การ Shader หนักวิธีการ" ไม่ได้เป็นเพียงความถูกต้องแม่นยำมากขึ้นก็ยังไม่เป็นที่รู้จักว่าสำหรับการช้า
Nicol Bolas

1
@StephanvandenHeuvel Sure แต่นั่นคือหมอกที่มองตามพื้นที่ ไม่ใช่หมอกที่ปรับแนวพื้นดิน แก้ไข?
วิศวกร

1
@NickWiggill ใช่คุณถูกต้อง
Stephan van den Heuvel

1
IIRC, Wii มีหมอกบนพื้นดินในแนวกึ่งคงที่ (กึ่ง) เห็นได้ชัดว่าglFogCoordส่วนขยายในมรดก OpenGL ได้รับอนุญาตให้ทำเช่นนั้นได้ แม้ว่าจะฟังดูมีข้อ จำกัด แต่ก็เป็นแบบภาคพื้นดินหรือระยะทาง
Laurent Couvidou

1
Quake 3 ทำอะไรที่คล้ายกันนี้โดยใช้วิธี fixed-pipeline ที่ทำงานกับ GL1.1 ข้อกังวลใหญ่ที่ฉันมีคือการเติม / ถอนอาจจะแย่มาก แต่มันก็คุ้มค่าที่จะดาวน์โหลดซอร์สโค้ด Q3 และทบทวนการใช้งาน คุณอาจไม่ทำแบบเดียวกัน แต่อย่างน้อยมันอาจช่วยคุณในการตัดสินใจ
Maximus Minimus

คำตอบ:


15

เมื่อคุณขอประสบการณ์นี่เป็นของฉัน

ย้อนกลับไปในสมัยที่ฉันเขียนโปรแกรมเกม PS2 แนวทาง "เลเยอร์อัลฟ่าล่าม" เป็นวิธีที่เรามักจะใช้หมอก บางครั้งเป็นหมอกบนพื้นดิน แต่โดยทั่วไปจะเป็นหมอกเต็มหน้าจอ และมันก็ใช้ได้ดีทั้งสองกรณี ดังนั้นใช่มันเป็นไปได้ในวัน pre-fragment-shader

เรียงกันของ ปัญหาดังที่คุณเคยสังเกตไว้คือถ้าคุณต้องการหมอกที่นุ่มนวลอย่างที่เห็นในภาพหน้าจอคุณต้องมีจำนวนอัลฟาที่ค่อนข้างไร้สาระ

บน PS2 เราสามารถซื้อได้ระหว่างสามถึงห้าชั้น ซึ่งแน่นอนว่าดูเหมือน "กำแพง" ของหมอกที่ลอยอยู่เบื้องหน้าคุณ ยิ่งไปกว่านั้นและอัตราการเติมเริ่มฆ่าอัตราเฟรมของเรา

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

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

แต่สมมติว่าเรากำลังใช้หน้าจอกว้างที่หันหน้าไปทางทำหมอกบนพื้นดินนี้และทำการคำนวณบางอย่างเกี่ยวกับวิธีทำหมอกที่นุ่มนวลอย่างแท้จริงโดยใช้วิธีนี้บนพื้นราบด้วยกล้องมองไปข้างหน้านั่นคือสถานการณ์ในอุดมคติของเรา . สมมติว่าความละเอียด HD: 1920x1080 ซึ่งทำให้เส้นขอบฟ้าของเราอยู่ที่ scanline 540 และสมมติว่าเราสามารถมองเห็นไปจนถึงขอบฟ้าได้ (นั่นคือสมมติว่าคุณไม่มีหมอกที่ทึบถึงก่อนที่จะถึงขอบฟ้า) ด้วยการเริ่ม Quad Quad หนึ่งครั้งและหยุดที่ Scanline แต่ละครั้ง (เพื่อให้ได้หมอกที่ราบรื่น) เราต้องการ (540 * 2 ==) 1080 Quads quads แต่ละกลุ่มหมอก 1080 เหล่านี้จะครอบคลุมทั้งแนวกว้างของหน้าจอ

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

ด้วยการประมาณนั้นเราจะได้รับ (1920x300 ==) 576,000 พิกเซลที่ถูกสัมผัสโดยรูปสี่เหลี่ยมหมอกโดยเฉลี่ย โดยรวมนั่นคือ (576,000 * 1080 ==) 622,080,000 พิกเซลที่ถูกแตะรวมสำหรับผลกระทบทั้งหมด "หมอกเรียบผ่านการเรนเดอร์เรขาคณิตโปร่งแสงจำนวนมาก" และจำนวนนั้นจะเพิ่มขึ้นสำหรับผู้ที่ใช้งานที่ความละเอียดสูงกว่า และยิ่งไปกว่านั้นเราได้รับการทดสอบจำนวนมากเทียบกับ z-buffer และการดำเนินการผสมผสานพิกเซลเกือบเท่ากันเนื่องจากเลเยอร์โปร่งใสเหล่านี้ทั้งหมดวาดขึ้นมาซ้ำแล้วซ้ำอีก นั่นเป็นจำนวนพิกเซลมาก

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

โปรดทราบว่าเนื่องจากเรามีการซ้อนทับ 1080 quads เราอาจต้องการค่าอัลฟาประมาณ (1.0 / 1080 ~ =) 0.0009 ที่ตั้งค่าไว้ในแต่ละค่า (เราสามารถไปได้สูงกว่านั้น แต่นี่คือค่าที่สมมติว่าเราต้องการกระจายช่วงโดยรอบให้มากที่สุด) โปรดทราบว่าค่านี้ไม่สามารถแสดงเป็นองค์ประกอบอัลฟาของค่าสี 32 บิต (256 * 0.0009 ~ = 0.237 และจะถูกปัดเป็น 0 ถ้าคุณลอง) คุณจะต้องระบุค่า 0.0009 ให้กับ OpenGL เป็นค่าทศนิยมเพื่อให้ใช้งานได้ (โปรดทราบว่าคุณไม่ต้องการกำหนดค่าเดียวกันนี้ในแต่ละรายการ - ในขณะที่เรากำหนดไว้ว่าเราต้องการให้หนึ่ง Quad เริ่มต้นและอีกหนึ่งจุดเพื่อสแกนแต่ละเส้นใต้เส้นขอบฟ้าเพื่อให้เรามีหมอกที่ราบรื่น

นอกจากนี้โปรดทราบว่าหมอกผสมไม่ทำงานอย่างถูกต้องโดยใช้วิธีการนี้เช่นเดียวกับ shader ที่ทันสมัย ​​- แทนที่จะได้รับการคำนวณหนึ่ง "ผสมผสานระหว่างสีวัตถุฐานและสีหมอกโดยใช้เปอร์เซ็นต์นี้" คุณจะได้รับ 1080 การคำนวณ "ผสมผสานระหว่างสีจนถึงสีหมอกตามเปอร์เซ็นต์หมอก" ซึ่งหมายความว่าหมอกจะส่งผลกระทบต่อวัตถุหลังจากการตกหล่นลอการิทึม (นั่นคือวัตถุที่ได้รับผลกระทบจาก 20 สายหมอกจะปรากฏขึ้นน้อยกว่าสองเท่าที่หมอกเมื่อสิ่งที่ได้รับผลกระทบจาก 10 สายหมอกเนื่องจากสายหมอกรุ่นแรกมีผลกระทบในการผสมมากขึ้น)

ทั้งหมดนี้คือการพูด: กรุณาใช้ส่วนที่แตก

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


1
+1 สำหรับคำตอบที่ครอบคลุมโดยพิจารณาจากประสบการณ์จริง
concept3d

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