24-Colordepth นั้นไม่เพียงพอเหรอ?


30

ฉันสังเกตเห็นว่าในการไล่ระดับสีที่อ่อนมาก colordepth แบบ 24 บิตนั้นไม่เพียงพออย่างที่คุณเห็นการเปลี่ยนสี สิ่งนี้จะปรากฏออกมามากที่สุดในฉากมืดหรือท้องฟ้ายามค่ำคืน

ทำไมไม่มีใครเปลี่ยน colordepth เป็นสองไบต์ต่อช่อง ฉันรู้ว่ามันจะทำงานได้เยอะและฮาร์ดแวร์จำนวนมากจะต้องได้รับค่าตอบแทนใหม่ แต่ฉันคิดว่ามันน่ารำคาญนิดหน่อย ฉันไม่คิดว่าเทคโนโลยีของฮาร์ดแวร์ยังไม่โตพอ

เหตุใดจึงไม่มีใครทำเช่นนั้น?

นี่คือรูปภาพของ "The War Z" ที่คุณสามารถเห็นสิ่งที่ฉันหมายถึง:

การเปลี่ยนสีของ War Z


12
รูปภาพของคุณอยู่ในรูปแบบ JPEG ซึ่งสามารถสร้างสิ่งประดิษฐ์ได้เช่นกัน คุณสามารถนำเสนอตัวอย่างในรูปแบบ lossless ได้หรือไม่?
Emperor Orionii

คุณล้อเล่นกับฉันไหม คุณบ่นเรื่องความลึกของบิต แต่คุณอัพโหลดไฟล์ JPEG?
ธารา

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

คำตอบ:


19

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

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


1
แม้ว่าผู้ใช้จะไม่สามารถเข้าถึงโดยตรงสำหรับผู้ใช้ปลายทางจอมอนิเตอร์ 27/30 "ระดับสูงที่มีเป้าหมายที่ผู้เชี่ยวชาญด้านภาพ / วิดีโอคือ 14 บิตภายใน / 10 ภายนอกและใช้ 4 บิตพิเศษเพื่อจัดเก็บตารางค้นหาเพื่อช่วยในการปรับเทียบสีบนจอแสดงผล
Dan Neely

@DanNeely: "ผู้ใช้ปลายทาง" ใด ๆ สามารถมีหนึ่งพันสองพันดอลลาร์สหรัฐพวกเขายังต้องการการ์ดกราฟิกระดับมืออาชีพเช่น Quadro เมื่อพิจารณาถึงสิ่งที่บางคนจ่ายสำหรับทีวีและระบบเสียงของพวกเขาสิ่งนี้ก็ไม่เลว
Zan Lynx

@ZanLynx ฉันใช้วลีที่กำหนดเป้าหมายไปยังมืออาชีพซึ่งตรงกันข้ามกับเฉพาะผู้เชี่ยวชาญที่จงใจ ทุกคนสามารถซื้อสแต็คเต็มรูปแบบได้ แต่ราคาสูงมากและมีประโยชน์น้อยมากที่คนน้อยมากที่ทำ อดีตเพียง 1.17% ของผู้ใช้ Steam มี 2560 หน้าจอ และจอภาพเป็นเพียงส่วนเดียวของสแต็คที่จำเป็นซึ่งผู้ใช้ระดับสูงมีแนวโน้มที่จะได้รับความบังเอิญเพราะบางส่วน (ทั้งหมด?) ของปี 2011 รุ่นชื่อแบรนด์ 2560 จอแสดงผลจากผู้ขายหลักรวมถึงสี 10/14 บิต และการนำเข้าของเกาหลีที่ถูกกว่านั้นยังไม่สามารถนำมาใช้ได้เป็นระยะเวลานาน การ์ด Quadro / etc ไม่ได้ให้อะไรกับเกมเมอร์ vs Standard
Dan Neely

1
เป็นไปได้หรือไม่ว่าแถบดังกล่าวนั้นเป็นจริงของการเพิ่มประสิทธิภาพข้อความเพื่อลดปริมาณงานที่แสดงผลบนท้องฟ้า? เมื่อฉันสร้างการไล่ระดับสี 24 บิตใน GIMP ดูเหมือนว่าจะไม่เป็นเช่นนั้น ดูstatic.inky.ws/image/4306/gradient.pngสำหรับการไล่ระดับสี 24 บิต
ldrumm

2
@ldrumm ไม่มีไม่ได้จริงๆคุณจริงๆเอาประโยชน์จากช่วงที่มากที่สุดและเปิดใช้งาน dithering ใน GIMP, ดูที่ตัวอย่างนี้มี dithering (แถบเล็กน้อยมองเห็นได้) และที่นี่โดยไม่ต้อง dithering ปัญหาคือคุณไม่สามารถโพสต์กระบวนการที่เป็นสากลลงไปในพื้นผิวและพื้นผิวส่วนใหญ่ไม่ได้ถูกสร้างขึ้นโดยใช้การไล่ระดับสีหากพวกเขาทาสีด้วยมือและมีพื้นที่ขนาดใหญ่ที่มีการไล่ระดับสีระหว่าง 2 สีที่คล้ายกัน จากนั้นจะมีแถบคาด
PeterT

44

อ๋อคุณไม่ได้เป็นคนแรกที่จะแจ้งให้ทราบนี้ :) ด้วยอัตราส่วนคอนทราสต์สูงในปัจจุบัน 8 บิตต่อองค์ประกอบไม่เพียงพอที่จะทำให้การไล่ระดับสีราบรื่นโดยไม่ต้องใช้แถบที่มองเห็นได้เว้นแต่ว่าจะมีการใช้ dithering

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


นอกจากนี้ยังมีวิธีอื่นในการแก้ไขแถบเนื่องจากความแม่นยำ 8 บิต จำกัด ดังที่ฉันได้กล่าวไว้ก่อนหน้านี้เอ็นจิ้นของเกมสามารถใช้ditheringเพื่อซ่อนแถบ


(รูปภาพของแมวที่มีจานสี 256 สีแบบไม่มีและมีสี dithering สร้างโดยผู้ใช้ Wikipedia Wapcapletใช้ภายใต้ใบอนุญาตCC-By-SA 3.0 )

การเพิ่มความแตกต่างเล็กน้อยที่± 0.5 / 255 ก่อนที่จะเขียนค่าพิกเซลลงใน framebuffer นั้นมีประสิทธิภาพอย่างมากในการซ่อนแถบในการไล่ระดับสีที่ราบรื่นและไม่สามารถสังเกตเห็นได้ หากคุณอยู่ในเอ็นจิ้น HDR คุณจะทำสิ่งนี้ระหว่างขั้นตอนการจับคู่แผนที่


ในที่สุดตามที่คนอื่น ๆ ได้กล่าวไว้การบีบอัดพื้นผิวอาจเป็นแหล่งที่มาของสิ่งประดิษฐ์ที่มีลักษณะคล้ายแถบในภาพมากกว่าความแม่นยำ 8 บิต นี่อาจเป็นสิ่งที่เกิดขึ้นกับท้องฟ้าในภาพนั้นแม้ว่าจะเป็นการยากที่จะบอกได้ แต่มันก็มีการบีบอัด JPEG ไว้มากมายที่สิ่งประดิษฐ์ใด ๆ เนื่องจากการบีบอัด DXT นั้นค่อนข้างล้นมือ


+1 - คำตอบที่ยอดเยี่ยมและฉันพลาดโอกาสที่แถบนั้นมีสาเหตุอื่นทั้งหมด
Steven Stadnicki

1
+1 สำหรับการสังเกตว่าไฟล์เป็น jpeg ตัวอย่างที่ไม่สูญเสียโดย OP จะป้องกันการตัดสินที่ไม่ดีเนื่องจากเสียงรบกวนในข้อมูล
ldrumm

@ldrumm ยังเป็นเกม / เครื่องมือที่ไม่น่ากลัว ...
ไบรอันออร์ติซ

ฉันเพิ่มรูปภาพเพื่อเน้นความแตกต่างของการทำ dithering อย่าลังเลที่จะยกเลิกหากคุณไม่ชอบ :)
BlueRaja - Danny Pflughoeft

13

นอกจากนี้ยังเป็นที่น่าสังเกตว่าหน้าจอ LCD จำนวนมากไม่ได้มีแม้แต่ 8 บิตต่อช่อง คนที่ถูกกว่ามักใช้บิตน้อยกว่าและใช้ลูกเล่นต่าง ๆ เพื่อพยายามซ่อน ตัวอย่างเช่นพวกเขาอาจสลับอย่างรวดเร็วระหว่างสองสีที่อยู่ติดกันเพื่อเป็นตัวแทนหนึ่งในระหว่าง http://www.anandtech.com/show/1557/3

มีรายละเอียดบางอย่างเกี่ยวกับวิธีที่ DXGI สนับสนุน 10 บิตต่อช่องสัญญาณและสว่างกว่าสีขาวที่http://msdn.microsoft.com/en-us/library/windows/desktop/jj635732%28v=vs.85%29.aspx

D3D ยังรองรับมากกว่า 8 บิตต่อช่องสัญญาณเป็นเวลาหลายปี ไม่มีอะไรหยุดนักพัฒนาที่ทำอะไรบางอย่างที่ผิดเพี้ยนจาก 16 บิตต่อช่องเป็น 8 บิตถ้าพวกเขาคิดว่ามันเป็นความคิดที่ดี

แน่นอนว่าจะไม่ช่วยอะไรมากหากข้อมูลต้นฉบับ (พื้นผิวและอื่น ๆ ) มีเพียง 8 บิต (หรือน่าจะเป็น DXT1 มากกว่าซึ่งมีประสิทธิภาพ 5-6-5 บิตต่อช่อง) ฉันเชื่อว่านั่นคือสิ่งที่เกิดขึ้นกับท้องฟ้าในภาพหน้าจอนั้น (เบลอแบบเกาส์ 8-bpp ทำให้มันราบรื่นมากสำหรับฉัน) แต่มันยากที่จะแน่ใจ


10

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

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

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

  • แต่งเนื้อสัมผัสดั้งเดิมในรูปแบบ 16 บิตเช่น TIFF 16 บิต
  • เมื่อคุณเตรียมพื้นผิวสำหรับเอ็นจิ้นเกมให้หาพิกเซลที่มืดที่สุดในภาพและติดตามสิ่งนี้เป็นออฟเซต สมมุติว่าค่าพิกเซลนี้คือ 0.1 ในช่วง 0-1 ที่เป็นไปได้
  • จากนั้นค้นหาพิกเซลที่สว่างที่สุดและลบพิกเซลที่มืดที่สุดเพื่อให้ได้ช่วงของค่าในภาพ ดังนั้นหากพิกเซลที่สว่างที่สุดยังคงมืดอยู่ - พูด 0.35 - ช่วงนั้นมีเพียง 0.35 - 0.1 = 0.25 มีเพียง 25% ของช่วงค่าที่ปรากฏในภาพ
  • สร้างพื้นผิวในเกมที่บีบอัด DXT / BCของคุณ ลบค่าที่มืดที่สุดจากทุกพิกเซลและคูณเพื่อใช้ช่วงสีทั้งหมด ในการคำนวณตัวอย่างเราลบค่าความมืดของเราที่ 0.1 และเนื่องจากมีเพียง 25% ของช่วงค่าที่มีอยู่เราจึงคูณค่าพิกเซลทุกพิกเซล 4x เพื่อสร้างพื้นผิวในเกม ตรวจสอบให้แน่ใจว่าได้ทำสิ่งนี้ทั้งหมดก่อนที่คุณจะหาปริมาณภาพอิมเมจ 16 บิตของคุณลงไปที่อินพุต 8bpp ไปยังคอมเพรสเซอร์ DXT อิมเมจเอาต์พุตจะใช้ช่วงทั้งหมดของค่าที่สนับสนุนโดยรูปแบบในเกม เรากำลังจัดสรรบิตทั้งหมดของเราเพื่อแสดงค่าจริงที่ปรากฏในภาพ
  • เก็บค่าความมืดชดเชย (0.1) และช่วง (0.25) ในเมตาดาต้าที่ใดที่หนึ่ง ส่งต่อสิ่งเหล่านี้เป็นอินพุตไปยังตัวแบ่งพิกเซลของคุณ
  • ในโค้ดพิกเซลเชดเดอร์, ตัวอย่างที่คุณเลื่อน, ขยายพื้นผิว, แปลงเป็นค่าลอยตัวจากนั้นทำการคูณ / เพิ่มเพื่อเรียกคืนค่าสีดั้งเดิม กล่าวอีกนัยหนึ่งคูณด้วย 0.25 และเพิ่ม 0.1 เพื่อคืนค่าที่เก็บไว้ในอิมเมจต้นฉบับ

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


1

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

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