HDR ทำงานอย่างไร


17

ฉันพยายามเข้าใจว่า HDR คืออะไรและทำงานอย่างไร

ฉันเข้าใจแนวคิดพื้นฐานและมีความคิดเล็กน้อยเกี่ยวกับวิธีการนำไปใช้กับ D3D / hlsl

อย่างไรก็ตามมันยังคงมีหมอกสวย

สมมติว่าฉันแสดงทรงกลมด้วยพื้นผิวโลกและรายการจุดเล็ก ๆ เพื่อทำตัวเป็นดาวฉันจะแสดงสิ่งนี้ใน HDR ได้อย่างไร

นี่คือบางสิ่งที่ฉันสับสนเกี่ยวกับ:

  • ฉันเดาว่าฉันไม่สามารถใช้รูปแบบภาพพื้นฐานใด ๆ กับพื้นผิวได้เนื่องจากค่าจะถูก จำกัด ที่ [0, 255] และถูกจับไปที่ [0, 1] ในรูปแบบ กันไปสำหรับบัฟเฟอร์ด้านหลังฉันคิดว่ารูปแบบต้องเป็นรูปแบบจุดลอยตัวหรือไม่

  • ขั้นตอนอื่น ๆ ที่เกี่ยวข้องมีอะไรบ้าง แน่นอนว่าจะต้องมีมากกว่าการใช้รูปแบบจุดลอยตัวเพื่อเรนเดอร์ไปยังเป้าหมายเรนเดอร์จากนั้นใช้การเบ่งบานเป็นกระบวนการโพสต์? (พิจารณาผลลัพธ์จะเป็น 8bpp อยู่ดี)

โดยพื้นฐานแล้ว HDR มีขั้นตอนอย่างไรบ้าง? มันทำงานยังไง? ฉันไม่สามารถหาบทความ / บทความที่ดีที่อธิบายกระบวนการนอกเหนือไปจากบทความนี้ได้แต่ดูเหมือนว่าจะเรียดเรื่องพื้นฐานเล็กน้อยดังนั้นมันจึงสับสน

คำตอบ:


19

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

bit-tech.net การเปรียบเทียบ HDR

ด้านขวาของภาพนี้กำลังใช้ HDR มันใช้ประโยชน์จากช่วงของสีได้มากขึ้นความมืดมีความเข้มและพื้นที่สว่างจะสว่างขึ้น ในการเปรียบเทียบด้านซ้ายมือของภาพจะดูแบนเล็กน้อย

ขั้นตอนพื้นฐานคือ:

  1. ทำให้ฉากของคุณเป็นพื้นผิวจุดลอย (ด้วยรูปแบบเช่น A16B16G16R16F) โดยใช้พื้นผิวจุดลอยตัวอื่น ๆ ในรุ่นของคุณและ / หรือไฟที่อาจมีความสว่างมากกว่า 1.0f

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

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

หวังว่าจะช่วย


ฉันรู้ว่านี่เป็นคำถามเก่า (มาก) แต่คุณสามารถอ้างอิงฉันกับอัลกอริทึมการทำแผนที่โทนเสียงที่ดี แต่ง่ายหรือไม่?
JSQuareD

6

ในทางเทคนิค HDR นั้นหมายถึงการใช้ค่าที่เป็นไปได้ที่กว้างขึ้นสำหรับกราฟิกของคุณ โดยปกติคุณจะถูก จำกัด ให้ 256 ค่าแยกสำหรับช่องสีแดงสีเขียวและสีน้ำเงินซึ่งหมายความว่าหากคุณมี 2 รายการหนึ่งสว่างเป็นสองเท่าอีกค่าหนึ่งและที่ 3 สว่างกว่าครั้งแรก 10,000 เท่า วิธีที่คุณสามารถแสดงทั้ง 3 อย่างในฉากเดียวกันได้อย่างถูกต้อง - คุณทำให้วัตถุสว่างเพียง 256x สว่างกว่าวัตถุแรกแทนหรือคุณทำให้วัตถุที่น่าเบื่อทั้งคู่เป็นสีดำสนิท (สูญเสียความแตกต่างระหว่างวัตถุเหล่านั้น) กว่าพวกเขาทั้งสอง

สิ่งนี้ง่ายต่อการแก้ไขโดยใช้ค่าจุดลอยตัวสำหรับค่าสีแดง / สีเขียว / สีน้ำเงิน - แต่ตอนนี้คุณมีปัญหาเกี่ยวกับวิธีการแสดงบนอุปกรณ์กราฟิกที่จัดการเฉพาะค่าคงที่จำนวนต่อเนื่อง (เช่น 256) . ดังนั้นส่วนที่สองของปัญหาคือวิธีการแมปค่าจุดลอยตัวของคุณกลับไปยังช่วงที่ จำกัด วิธีแก้ปัญหาเล็ก ๆ น้อย ๆ คือการปรับค่าทั้งหมดตามสัดส่วนในช่วงที่ไม่ต่อเนื่อง แต่นี่หมายถึงว่า 1 พิกเซลที่สว่างมากสามารถทำให้หน้าจอที่เหลือเป็นสีดำ ฯลฯ บางครั้งนี่คือสิ่งที่คุณต้องการ ลิงค์สำหรับตัวอย่างของวิธีที่คุณสามารถเข้าถึงสิ่งนี้

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


5

คอมพิวเตอร์แสดงแต่ละพิกเซลบนหน้าจอเป็นหน่วยความจำ 24 บิตเท่านั้น: 8 สำหรับสีแดง, 8 สำหรับสีเขียวและ 8 สำหรับสีน้ำเงิน นี่เป็นบิตที่เพียงพอที่มนุษย์จะไม่สังเกตเห็นหากคุณเพิ่มมากขึ้นและไบต์ 8 บิตนั้นสะดวกมากสำหรับไมโครโปรเซสเซอร์ดังนั้นมันจึงติดอยู่

ในขณะที่ 8 บิตมีความแม่นยำเพียงพอที่จะแสดงภาพ แต่ก็ไม่แม่นยำพอที่จะคำนวณภาพได้ ที่จุดต่าง ๆ ในขณะคำนวณภาพต้องมีความแม่นยำอย่างน้อย 32 บิต

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

มีแนวโน้มในเรียลไทม์กราฟิก 3D ไปสู่การรักษากราฟิกทั้งหมดในความแม่นยำ>>>> 8 บิตจนถึงช่วงเวลาที่เป็นไปได้ล่าสุดซึ่งเวลา> 8 บิตของสีแดงจะลดลงเป็น 8 บิตและอื่น ๆ สำหรับสีเขียวและสีน้ำเงิน

HDR หมายถึงการแสดงผลภาพที่มีความแม่นยำสูงกว่า 8 บิต ในวิดีโอเกมทีวีร่วมสมัยความแม่นยำ 16 บิตเป็นบรรทัดฐานและนี่อาจเป็น "เพียงพอ" ในวิดีโอเกมสำหรับปีต่อ ๆ ไป


2

แง่มุมหนึ่งที่ฉันคิดว่าสำคัญสำหรับ HDR คือแอปพลิเคชันแกมม่าของจอภาพที่ถูกต้อง

จอภาพที่คุณกำลังดูสร้างแสงเป็นฟังก์ชันของพิกเซลอินพุต คุณอาจคาดหวังว่าพิกเซลที่มีค่า 255 จะสร้างแสง (ประมาณ) 255 เท่าของแสงที่มากกว่าพิกเซลที่มีค่า 1 ซึ่งไม่ใช่ในกรณีนี้ ด้วยแกมม่ามอนิเตอร์มาตรฐาน 2.3 จะสว่างกว่า 255 ^ 2.3 เท่าหรือประมาณ 340000!

ทุกคนที่ผลิตเนื้อหา (ผู้แสดงภาพของกล้อง) รู้เรื่องนี้หรือ (ถ้าคุณเป็นนักออกแบบ) คุณจะชดเชยโดยปริยาย

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

  • แก้ไขพื้นผิวของคุณสำหรับแกมม่า

  • แสดงทุกอย่างด้วยแสงแบบเส้นตรง (ซึ่งคุณต้องการความแม่นยำสูงเนื่องจากช่วงแสงแบบไดนามิกสูง)

  • ใช้การแปลงแกมม่าผกผันของจอภาพเป็นสิ่งสุดท้ายก่อนที่คุณจะวางภาพบนหน้าจอ

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


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