Subpixel Rendering สำหรับ Ray Tracer


16

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

เห็นได้ชัดว่ามีวิธีคล้ายกันในการทำเช่นเดียวกันกับเครื่องตรวจจับรังสี คุณทำการกรองการสร้างใหม่ในแต่ละช่องย่อยแยกจากกัน

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


รูปภาพที่แสดงผลพิกเซลย่อยของคุณจะยังคงดูดีไหมถ้าดูบนหน้าจอในแนวตั้ง?
jamesdlin

ในฐานะวิศวกรฉันไม่เคยเห็นด้วยที่จะใช้ ... ความคิดที่แตกสลาย ยกเว้นถ้าฉันแน่ใจว่าจอแสดงผลคงที่ทั้งหมด เหมือน appli สำหรับ iPhone 5S การใช้เทคนิคนี้สร้างภาพแตกจากหน้าจอโดยใช้รูปแบบที่กลับด้านหรือการจัดเรียงที่แตกต่างกัน
v.oddou

คำตอบ:


14

เป็นไปได้อย่างสมบูรณ์แบบ

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

ตัวอย่างเช่นpenTile RGBGมีสอง subpixels สีเขียวจำนวนมากเป็นสีแดงและสีน้ำเงินตามที่ภาพจาก Wikipedia แสดง:

ภาพโคลสอัพของเรขาคณิตพิกเซล RGBG

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

แบบอักษรมีการแสดงผลตามความต้องการ

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

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

ไม่น่าจะมีประโยชน์ในระยะยาว

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


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

1
@ AlanWolfe ใช่ แต่มันก็แพงกว่า 3 เท่าในการแสดงผล
joojaa

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

@ AlanWolfe ฉันไม่เข้าใจข้อสงสัยของคุณ รูปภาพทั้งหมดแสดงผลด้วยพิกเซลย่อยแล้ว แต่สีจะถูกจัดแนวให้ไม่ตรงตามระหว่างพิกเซลที่สามถึงครึ่งของพิกเซล ฉันไม่สามารถเห็นได้ว่าการแก้ไขการจัดแนวที่ผิดพลาดนั้นล้มเหลวในการสร้างภาพที่มีคุณภาพสูงขึ้นได้อย่างไร คุณมีข้อกังวลใด ๆ (ซึ่งอาจทำให้คำถามที่ดี ... )?
trichoplax

3
@joojaa ไม่มีเหตุผลว่าจะมีราคาแพงกว่าการแสดงผล 3 เท่า คุณไม่จำเป็นต้องยิงจำนวนรังสี 3 เท่า คุณจะต้องใช้น้ำหนักต่างกัน 3 น้ำหนักเมื่อสะสมรังสีไว้ใน framebuffer อย่างมีประสิทธิภาพคุณใช้เคอร์เนลลดรอยหยักที่แตกต่างกันสำหรับแต่ละช่องสี
นาธานรีด

9

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

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


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

นอกจากนี้เนื่องจากวิธีที่ข้อความมีแนวโน้มที่จะประกอบด้วยรูปแบบเวกเตอร์ที่เรียบง่ายและซ้ำซ้อนการรวมการแสดงผลพิกเซลย่อยลงในฟอนต์เรนเดอร์เสนอโอกาสในการปรับให้เหมาะสมพิเศษมากกว่าการเรนเดอร์ข้อความลงในบัฟเฟอร์

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

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


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