เมื่อคุณขอประสบการณ์นี่เป็นของฉัน
ย้อนกลับไปในสมัยที่ฉันเขียนโปรแกรมเกม 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 ถ้ามันเป็นไปได้อย่างคลุมเครือในเวลานั้น