‘Gaussian splatting’ เจ๋งมากทีเดียว
(aras-p.info)- งานวิจัย 3D Gaussian Splatting ของ SIGGRAPH 2023 เป็นแนวทางที่สร้างฉากจากภาพถ่ายด้วย 3D Gaussian หลายล้านตัวและเรนเดอร์ได้แบบเรียลไทม์ พร้อมเปิดเผยการทดลองทำระบบแสดงผลด้วย Unity
- ฉากถูกแทนด้วยชุดของ blob ในอวกาศที่มีตำแหน่ง การหมุน สเกล 3D แบบไม่สม่ำเสมอ ความทึบแสง และ ค่าสัมประสิทธิ์ทรงกลมฮาร์มอนิก แทนที่จะใช้ mesh, voxel หรือ distance field
- วิธีนี้ ไม่ใช่ NeRF และอิมพลีเมนต์ทางการก็ไม่ได้ใช้ fixed-function rasterization pipeline แต่ใช้ซอฟต์แวร์เรนเดอร์แบบ tile-based ที่ทำงานบน CUDA 100%
- อิมพลีเมนต์บน Unity ใช้เวลา 23.8ms ซึ่งช้ากว่า viewer ทางการที่ 7.40ms ที่ความละเอียด 1200x800 บน NVIDIA RTX 3080 Ti แต่เขียนด้วย HLSL ทั่วไปจึงทำงานบน Mac ได้
- ฉาก bicycle ใช้พื้นที่บนดิสก์ 1.5GB มี blob ราว 6 ล้านตัว ใช้ประมาณ 250 ไบต์ต่อ blob ทำให้ทั้งขนาดข้อมูลและหน่วยความจำ GPU เป็นเป้าหมายสำคัญในการปรับปรุงนอกเหนือจากประสิทธิภาพ
งานวิจัย SIGGRAPH 2023 และการทดลองบน Unity
- งานวิจัย SIGGRAPH 2023 3D Gaussian Splatting for Real-Time Radiance Field Rendering เป็นผลงานของ Kerbl, Kopanas, Leimkühler และ Drettakis
- มีการเปิดเผยเว็บไซต์ของงานวิจัย ซอร์สโค้ด และชุดข้อมูล จึงสามารถลองทดลองและทำซ้ำได้โดยตรง
- การทดลองบน Unity มุ่งเน้นที่การรับไฟล์ “โมเดล” Gaussian Splat ที่สร้างไว้แล้วมา แสดงผลแบบเรียลไทม์
- อิมพลีเมนต์ถูกเผยแพร่ที่ aras-p/UnityGaussianSplatting และมีแผนจะทำการทดลองเพิ่มเติมต่อไป
- อีกประเด็นที่สนใจคือสามารถลดขนาดข้อมูลได้หรือไม่ โดยอาจนำการทดลองบีบอัด float ก่อนหน้านี้มาใช้
Gaussian Splat ประกอบด้วยอะไรบ้าง
- Gaussian Splatting ใช้อนุภาค หลายล้านตัว แทนฉาก 3D แทนที่จะใช้ polygon mesh, voxel หรือ distance field
- อนุภาคแต่ละตัว หรือ “3D Gaussian” มีข้อมูลดังนี้
- ตำแหน่ง ในปริภูมิ 3D
- การหมุน
- สเกล 3D แบบไม่สม่ำเสมอ
- ความทึบแสง
- ข้อมูลสี
- สีไม่ได้เป็นค่าสีเดียว แต่แสดงด้วยค่าสัมประสิทธิ์ Spherical Harmonics ระดับ 3 จึงอาจเปลี่ยนไปตามทิศทางการมอง
- ตอนเรนเดอร์ อนุภาคจะไม่ถูกวาดเป็นทรงกลม 3D ที่ยืดยาว แต่จะถูก “splat” เป็น 2D Gaussian ใน screen space
- แก่นสำคัญคือการสร้างฉากจากภาพถ่ายให้เป็นชุดของ blob ที่มีสเกลและสี แล้วเรนเดอร์มันอย่างรวดเร็ว
ไม่ใช่ทั้ง NeRF และไม่ใช่ fixed-function rasterization
- Gaussian Splatting ไม่ใช่ NeRF
- มีการระบุชัดว่าไม่มีองค์ประกอบแบบ “Neural”
- เหตุผลที่มันเร็วก็ไม่ใช่เพราะ “ใช้ฮาร์ดแวร์ rasterization ของ GPU”
- อิมพลีเมนต์ทางการไม่ได้ใช้ rasterization pipeline
- มันถูกอิมพลีเมนต์ด้วย CUDA 100%
- ประสิทธิภาพของอิมพลีเมนต์ทางการไม่ได้มาจาก fixed-function rasterization แต่เกิดจากซอฟต์แวร์เรนเดอร์แบบ tile-based ที่จัดการอนุภาคที่มีการสเกลหลายล้านตัวได้อย่างมีประสิทธิภาพ
- อย่างไรก็ตาม rasterizer แบบ “ซอฟต์แวร์บน GPU” ที่เป็น tile-based ก็ไม่ใช่แนวคิดใหม่ทั้งหมด
ความเชื่อมโยงกับเทคนิคยุคก่อน
- ตัว Gaussian Splatting เองเชื่อมโยงกับงานอย่าง EWA Splatting ราวปี 2001~2002
- คือการวาง blob ที่มีสเกลและทิศทางไว้ในอวกาศ คำนวณว่ามันถูกฉายลงจออย่างไร แล้วจัดการรูปร่าง Gaussian ใน screen space
- เกม Ecstatica ในปี 1994 เป็นกรณีตัวอย่างที่แปลกและน่าสนใจของเรนเดอเรอร์ที่ใช้อิง ellipsoid
- Spherical Harmonics ถูกใช้ในฟิสิกส์มาหลายร้อยปี และเป็นที่รู้จักอย่างแพร่หลายในคอมพิวเตอร์กราฟิกส์ผ่านงานของ Ravi Ramamoorthi และ Peter-Pike Sloan ราวปี 2000
- งาน Ray tracing volume densities ของ Kajiya & Von Herzen ในปี 1984 อาจเป็นตัวอย่างการใช้งานช่วงแรกในวงการกราฟิกส์
- ดูสรุปที่เกี่ยวข้องได้ที่ Patapom’s page
- Point-Based Rendering ก็เป็นสาขาที่มีมานาน
- ระบบอนุภาคถูกใช้ในงาน VFX และการแสดงปรากฏการณ์ที่ไม่ใช่วัตถุแข็งมานานแล้ว
- The Use of Points as a Display Primitive เป็นงานจากปี 1985
- Surfels เป็นงานวิจัยปี 2000
- วงการ demoscene และเครื่องมือ VFX แบบเรียลไทม์ก็ใช้แนวทางเรนเดอร์ที่ไม่ดั้งเดิมมาโดยตลอด
- ตัวอย่างได้แก่ Fairlight & CNCD’s Agenda Circling Forth, Ceasefire (all falls down..), Number One / Another One
- Notch เป็นเครื่องมือ VFX แบบเรียลไทม์ที่มีความสามารถในการสร้าง จำลอง และแสดงผลวัตถุแบบจุดและ blob
- fogleman/primitive เป็นตัวอย่างเครื่องมือจากปี 2016 ที่แทนภาพด้วยชุดของ primitive shape
- “Dreams” ของ Media Molecule ใช้เรนเดอเรอร์แบบ splat และเวอร์ชันที่ออกจำหน่ายดูเหมือนจะเป็นการผสมหลายเทคนิคเข้าด้วยกัน
- งานนำเสนอ “Learning from Failure” ของ Alex Evans ดูได้ที่ SIGGRAPH 2015 และ Umbra Ignite 2015
- Tile-based rasterization สำหรับอนุภาคมีมาอย่างน้อยตั้งแต่งาน Holy smoke! Faster Particle Rendering using Direct Compute ของ Gareth Thomas ในปี 2014
- การแบ่งหน้าจอเป็น tile แล้วประมวลผลภายใน tile ช่วยลด memory traffic ได้
- วิธีแบบนี้ยังเชื่อมโยงกับรูปแบบการทำงานของ mobile GPU โดยรวมด้วย โดยการออกแบบยุคแรกของ PowerVR ย้อนกลับไปถึงปี 1996 และ Pixel Planes 5 ย้อนไปถึงปี 1989
สถานะปัจจุบันของ UnityGaussianSplatting
- aras-p/UnityGaussianSplatting คืออิมพลีเมนต์ ตัวแสดงผล ของโมเดล Gaussian Splat
- สถานะปัจจุบันใกล้เคียงกับ “ใช้งานได้ แต่ยังไม่เร็ว”
- เมื่อเรนเดอร์ฉาก bicycle ที่ 1200x800 บน NVIDIA RTX 3080 Ti จะเห็นความต่างด้านประสิทธิภาพชัดเจน
- viewer ทางการ: 7.40ms, 135FPS
- อิมพลีเมนต์บน Unity: 23.8ms, 42FPS
- ช้ากว่าราว 4 เท่า
- วิธีการ sort ก็มีผลต่อความต่างของประสิทธิภาพ
- อิมพลีเมนต์บน Unity ใช้ GPU bitonic sort ที่ค่อนข้างเรียบง่าย
- อิมพลีเมนต์ทางการใช้ CUDA radix sort ที่อิงกับ อัลกอริทึม OneSweep
- แนวทาง rasterization ก็แตกต่างกัน
- อิมพลีเมนต์ทางการใช้วิธี tile-based ที่เขียนด้วย CUDA
- อิมพลีเมนต์บน Unity ใช้ GPU rasterization pipeline ทั่วไป โดยเรนเดอร์แต่ละ splat เป็น quad ใน screen space
- อิมพลีเมนต์บน Unity มีข้อดีด้านการพกพา
- โค้ดเขียนด้วย HLSL ทั่วไปภายใน Unity จึงทำงานบน Mac ได้
- บน Apple M1 Max ฉากเดียวกันนี้เรนเดอร์ได้ที่ 108ms, 9FPS
- ปัจจุบันดูเหมือนว่าอิมพลีเมนต์บน Unity จะใช้หน่วยความจำ GPU น้อยกว่า
- viewer ทางการ: 4.8GB
- อิมพลีเมนต์บน Unity: 2.2GB
- ตัวเลขนี้รวมหน่วยความจำที่ Unity Editor ใช้งานด้วย
ขนาดข้อมูลและการใช้หน่วยความจำ
- การพูดถึง Gaussian Splatting มักเน้นที่คุณภาพและความเร็วในการเรนเดอร์ แต่ ขนาดข้อมูล และการใช้หน่วยความจำก็เป็นปัญหาใหญ่เช่นกัน
- ฉาก bicycle ใช้พื้นที่บนดิสก์ 1.5GB
- ฉากนี้ประกอบด้วย blob ราว 6 ล้านตัว
- แต่ละ blob ใช้ประมาณ 250 ไบต์
- ระหว่างรันไทม์ยังต้องใช้หน่วยความจำเพิ่มเติมสำหรับการ sort และการเรนเดอร์แบบ tile-based เป็นต้น
- งานนำเสนอ Dreams มีไอเดียที่น่าสนใจซึ่งอาจใช้เป็นแนวทางในการลดขนาดได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
การบอกว่าใช้ gradient descent และ differentiable rendering แต่หลีกเลี่ยงคำว่า “neural” ฟังดูเหมือนอวดนิด ๆ
ในเชิงแนวคิด มันคล้ายกับ NeRF ตรงที่ปรับแต่ง representation แบบอิงข้อมูล ซึ่งประมาณค่าตัวแปรที่เกี่ยวกับฉาก 3D จากภาพ ความต่างคือ NeRF โมเดล radiance field ซึ่งเป็นฟังก์ชันการส่งผ่านแสงทั้งหมด ขณะที่วิธีนี้ดูเหมือนจะโมเดลเฉพาะเงื่อนไขขอบเขตที่แสงไปถึง
เพราะเป้าหมายต่างกัน การใช้ basis ของ representation ที่ง่ายกว่าจึงสมเหตุสมผลและผลลัพธ์ก็ดูดี แต่ผมเสียดายที่พูดราวกับว่าการหลีกเลี่ยง neural network นั้นเป็นเรื่องน่าชื่นชมในตัวเอง neural network ไม่ได้ถูกใช้เพียงเพราะเป็นกระแส แต่เป็นตัวประมาณฟังก์ชันที่ทรงพลังจริง ๆ และโครงสร้างที่เรียกว่า “neural network” ก็มีขอบเขตกว้างมาก
นี่เป็นแค่ความรู้สึกจากโทนในบทนำของบล็อกโพสต์เท่านั้น อาจต่างจากตัว paper เองก็ได้
ดังนั้นจึงดูเข้าใจง่าย และน่าจะผสานเข้ากับซอฟต์แวร์ 3D อื่น ๆ เช่น editor หรือ renderer ได้ง่ายกว่า และดูเหมือนจะทำ animation ได้ด้วย ตัวประมาณฟังก์ชันแบบ black box ที่แทนทั้งฉากในคราวเดียวไม่ได้ให้ความรู้สึกว่า scalable หรือ elegant
อย่างไรก็ตาม แม้ neural network จะโมเดลปัญหาได้ดี แต่หลายครั้งเราก็ไม่รู้ว่าโมเดลที่ฝึกแล้วทำงานจริงอย่างไร และด้วยความต้องการข้อมูลจำนวนมากกับการต้องเทรนซ้ำเป็นรอบ ๆ จึงมีข้อจำกัดในการสร้างทางออกระยะยาว
ในกรณีนี้ ผมอยากมองในแง่ดีว่าผู้เขียนไม่ได้ปลุกปั่นสงครามวัฒนธรรมเล็ก ๆ แต่แค่เล่นมุกแบบเป็นกันเอง
แต่ละพิกเซลที่ render เป็นผลรวมถ่วงน้ำหนักของ contribution จาก Gaussian ที่ขึ้นกับมุมมองและไม่มีขอบเขต ดังนั้นการแยกว่า NeRF โมเดล radiance field ส่วนวิธีนี้โมเดลแค่เงื่อนไขขอบเขตจึงไม่ถูกต้อง
เมื่อคิดด้วยว่า NeRF ใช้ representation แบบ spherical harmonics อันดับต่ำในโดเมนทิศทางมาแล้ว มันก็แทบจะใกล้เคียง 3D+α จึงเกิดคำถามว่าทำไมต้องเลือก neural network เพื่อกู้คืนฟังก์ชันมิติต่ำแบบนี้
ตอน inference ต้อง sample neural network ซ้ำ ๆ ตาม ray ของสายตาสำหรับแต่ละพิกเซล แต่ representation แบบบีบอัดของ light field เป็นปัญหาที่วงการ graphics ทำกันมานานแล้ว ตรงนี้จึงค่อนข้างรู้สึกแปลก
ต่อมา Plenoxels ตัด “Ne” ออกจาก NeRF แล้วเพิ่มประสิทธิภาพทั้งการฝึกและ inference อย่างมาก ส่วน Instant NeRF ของ Nvidia ก็ชดเชยได้ระดับหนึ่งด้วยวิธี interpolate input embedding ที่ซับซ้อนเข้าไปใน neural network ขนาดเล็ก: https://nvlabs.github.io/instant-ngp/assets/mueller2022insta...
ในวิศวกรรม graphics พื้นที่ที่ neural network ถูกใช้กันแพร่หลายหลัก ๆ คือการกู้คืนข้อมูล sparse โดยเฉพาะ denoising ซึ่งเป็นปัญหามิติสูงจึงเป็นเรื่องธรรมชาติ ถึงอย่างนั้นก็ยังมีไม่บ่อยนักที่มันจะเหนือกว่าอัลกอริทึมที่มนุษย์ออกแบบเองอย่างชัดเจน และการใช้ neural network ขนาดเล็กเพื่อ compression ก็ดูมีอนาคต
ใน graphics มีงาน function approximation อยู่มาก จึงมีที่ให้ neural network เข้าไปใช้ได้ แต่ฟังก์ชันที่จัดการโดยทั่วไปเข้าใจและควบคุมได้มากกว่า จึงต่างจากโดเมนอย่างการทำความเข้าใจภาษาธรรมชาติ ซึ่งแทบเป็นไปไม่ได้ที่จะใช้วิธีอัลกอริทึมที่ออกแบบด้วยมือ
บทสนทนาจำนวนมากจบลงที่ AI=แย่, CRYPTO=แย่ ปัญหาไม่ได้อยู่ที่ความเห็นตรงข้ามผิด แต่คือถ้าตั้งข้อสรุปไว้ก่อนแล้วหยุดคิด ก็ไม่มีทางรู้ได้เลยว่าความคิดของตัวเองอาจเหลวไหลโดยสิ้นเชิงหรือไม่
เป็นงานที่เจ๋งมากจริง ๆ
ในบทความพูดถึง การเรนเดอร์แบบอิงจุด และระบบอนุภาค ซึ่งในเกมยุคหลัง ๆ รู้สึกเหมือนมีการขยับไปอย่างละเอียดสู่สไตล์อนุภาคแบบใหม่ที่เน้นจุดมากกว่าเศษเท็กซ์เจอร์ แต่ทำงานเหมือนระบบฟิสิกส์
ตัวอย่างเช่น Hogwarts: https://www.gamespot.com/a/uploads/original/1816/18167535/40..., Forspoken: https://oyster.ignimgs.com/mediawiki/apis.ign.com/project-at..., Starfield: https://dotesports.com/wp-content/uploads/2023/08/temple-loc..., AC6, FF16
จุดร่วมคือดูเหมือนอนุภาคจุดโปร่งใสมีสีที่มีฟิสิกส์ และโดยเฉพาะบนคอนโซล ดูเหมือนจะใช้เพื่อสร้างเอฟเฟกต์ราคาถูกบน GPU โดยไม่เพิ่มภาระให้ CPU ถ้ามีใครรู้ฝั่งพัฒนาเกมก็อยากฟัง
ถ้าไม่มีการจำลองของไหล ระบบอนุภาคแบบอิงจุดก็จะดูเหมือนดอกไม้ไฟเฉย ๆ ขั้นถัดมาคือให้แต่ละอนุภาคมีฟิสิกส์อย่างโมเมนตัมหรือลมอย่างอิสระ แล้วเรนเดอร์เป็นบิลบอร์ดเท็กซ์เจอร์ขนาดเล็ก ซึ่งจนไม่นานมานี้ยังใช้กับการแสดงผลระเบิดหรือควัน
ตอนนี้ประสิทธิภาพเครื่องและอัลกอริทึมฟิสิกส์ดีขึ้น จนสามารถรันการจำลองของไหลที่อนุภาคโต้ตอบกันแบบเรียลไทม์ได้ และเอฟเฟกต์ที่เห็นตอนนี้ก็น่าจะเป็นแนวนั้น
ในโลกเกม 3D การจัดการเฉพาะ primitive 3D จริง ๆ มีข้อได้เปรียบทั้งเชิงแนวคิดและโครงสร้างมาก และ point sprite ก็สามารถ扱ได้แทบเหมือนวัตถุ 3D ที่เล็กเกือบไร้ขนาด
ในทางกลับกัน ถ้าใส่สไปรต์ 2D ลงในฉาก 3D เมื่อมีความโปร่งใสบางส่วน ก็ต้องเรียงลำดับจากด้านหลังมาด้านหน้า เข้ากับ z-buffer ได้ไม่ดี ขัดกับลำดับการ batch ที่ปรับให้เหมาะกับ GPU และมักแทงทะลุพื้นผิว 3D จนเผยให้เห็นง่ายว่าเป็น 2D
เพื่อแก้ปัญหาเหล่านี้ จึงมีการสะสมทางประนีประนอมหลายแบบ เช่น ความโปร่งใสแบบ screen-door, เชดเดอร์ที่เปลี่ยนวิธีเขียน z-buffer, alpha test, alpha-to-coverage เป็นต้น
ใน VR การเรนเดอร์แบบอิงภาพ 2D ภายในฉาก 3D จะดูโดดออกมาแย่กว่าบนหน้าจอเดียว และเห็นชัดขึ้นมากว่าเป็นบิลบอร์ดแบน ๆ เมื่อนำเหตุผลเหล่านี้มารวมกัน ก็มีเหตุผลมากพอที่จะอยากหลุดออกจากเอฟเฟกต์สไปรต์เท็กซ์เจอร์ 2D ในฉาก 3D
กระแสฝั่ง AI ก็น่าจะเกี่ยวอยู่บ้างกับการที่ GPU มุ่งไปในทิศทางเหมือน “GPU ชุดคำสั่งย่อส่วนภายใน GPU” ผ่าน RT core และ tensor core เป็นต้น
เมื่อไม่กี่ปีก่อน ฝั่ง NVIDIA เคยเขียนเคอร์เนลที่ย้ายเคอร์เนล SE(3) ไปยัง tensor core ซึ่งก็ไม่น่าแปลกใจถ้าส่วน spherical harmonics ของ Gaussian splatting จะถูกพอร์ตบางส่วนได้ทั้งตอนบีบอัดและตอนรัน: https://developer.nvidia.com/blog/accelerating-se3-transform...
Gaussian splatting มีบริเวณรองรับในพื้นที่ 3D อยู่เสมอ จึงน่าจะมีประสิทธิภาพค่อนข้างดี และแม้จะแปลงแบบคร่าว ๆ เร็ว ๆ ผลลัพธ์สุดท้ายก็อาจยังออกมาค่อนข้างดี
การทำเกลียวสวย ๆ ของจุดเรืองแสงก็ทำได้ค่อนข้างง่าย Unreal Engine ก็น่าจะมีของคล้ายกัน แต่ผมไม่มีประสบการณ์ตรงมากนัก
ไม่ได้คิดว่ามันมีต้นกำเนิดจากตรงนั้น แต่เดโมนั้นคือหมุดหมายแรกที่ผมนึกออก
ตอนบทความ Siggraph ออกมาครั้งแรก ผมตื่นเต้นมาก
ผมถ่ายรูปห้องที่เคยอยู่ในช่วงประมาณ 10 ปีที่ผ่านมาไว้จากหลายร้อยมุม เพราะหวังว่าสักวันจะสร้างขึ้นใหม่เป็น 3D ได้ และ Gaussian splatting เป็นเทคนิคแรกที่รู้สึกว่าน่าจะสร้างขึ้นใหม่ให้เกือบเหมือนของจริงได้
ถ้าเครื่องมือพัฒนาเต็มที่กว่านี้ ผมตั้งตารอมากที่จะได้กลับไปเดินดูห้องเก่า ๆ แล้วจมอยู่กับความคิดถึง
ผมอาจถามแบบไม่รู้เรื่องเพราะไม่ค่อยรู้จักสาขานี้ แต่ วิดีโอพวกนี้ดูเจ๋งมากจริง ๆ
เท่าที่เข้าใจคือฉากหรือ radiance field จะเป็นแบบ คงที่ เสมอ และแสงก็ถูก bake ไว้แล้ว เลยสงสัยว่ามีความเป็นไปได้ไหมที่จะพัฒนาไปในทิศทางที่เปลี่ยนแสงแบบไดนามิกและรองรับการเคลื่อนไหวได้ด้วย
ใน radiance field ไม่มีแนวคิดอย่างการปล่อยแสง การสะท้อน หรือการดูดกลืนแสง ทุกอย่างถูกบี้รวมเป็นค่าเดียวที่เรียกว่า “แสงที่ถูกส่งผ่าน” ในความหมายนั้น radiance field จึงใกล้เคียงกับภาพถ่าย 3D
ถ้าจะเปลี่ยนสิ่งนี้ ต้องใช้ inverse rendering หรือ photogrammetry เพื่อประเมินตำแหน่งแหล่งกำเนิดแสง พื้นผิว วัสดุ ฯลฯ แล้วค่อยกลับไปใช้ path tracing แบบดั้งเดิม
อีกแนวทางหนึ่งไม่ใช่แอนิเมชันแต่เป็นวิดีโอ คือจับ radiance field ต่อเนื่องตามเวลา แล้วบีบอัดความคล้ายกันระหว่างเฟรมเพื่อให้ได้ความสอดคล้องเชิงเวลา
อาจนำหลาย ๆ ชิ้นมาต่อกันเพื่อทำแอนิเมชันได้ด้วย: https://twitter.com/8Infinite8/status/1699460316529090568
ส่วนการจัดแสงใหม่ มี NeRF variants จำนวนมากที่รองรับสิ่งนี้อยู่แล้ว ดังนั้นการปรับพารามิเตอร์วัสดุของ splat ให้เหมาะสมก็น่าจะเป็นไปได้
ตัวอย่างเช่น ในฉากในอาคาร ถ้าโต๊ะทำให้เกิดเงามืดบนพื้น NeRF ยังไม่เข้าใจแหล่งกำเนิดแสงและเงา จึงไม่รู้ว่าพื้นเป็นสีดำจริง ๆ หรือพื้นสีขาวถูกเงาโต๊ะบังไว้ หรือมี Stanford bunny สีน้ำเงินซ่อนอยู่ในเงา
ริกสแกน 3D ที่จับวัตถุขนาดเล็กอย่างใบหน้าคน แก้ปัญหาด้วยการควบคุมแสงและสุ่มตัวอย่าง BRDF โดยตรง หากควบคุมแสงไม่ได้ ก็อาจประเมิน BRDF ได้ แต่มีข้อจำกัด
การใส่แอนิเมชันกลับเข้าไปอาจทำได้ง่าย แต่ถ้าจะจับแอนิเมชันเอง ต้องใช้กล้องหลายตัว หรือเพราะเป็นมนุษย์จึงต้องพึ่งการประมาณอย่างโครงข่ายประสาทที่จินตนาการและเติมด้านตรงข้ามให้
Intel เคยทำโปรเจกต์เมื่อหลายปีก่อนที่ใช้กล้องหลายตัวจับฉาก แล้วเปลี่ยนตำแหน่งกล้องในขั้น post-processing ได้ ดูเหมือนตั้งเป้าใช้กับการถ่ายทอดอเมริกันฟุตบอล แต่ผมไม่เคยได้ยินข่าวว่ามีการเปิดตัวจริง ต้องใช้กล้องหลายตัวแบบใน Matrix
กล่าวคือเป็นวิธีทำให้ข้อมูลเคลื่อนไหวตามช่วงเวลา ปริมาณข้อมูลที่ต้องใช้อาจมากขึ้น แต่มีวิธี interpolation อยู่ จึงอาจไม่ได้แย่เกินไป
ถ้าฉากคงที่มีขนาด 2GB การประมาณช่วงเวลาแบบคร่าว ๆ น่าจะทำได้ในขนาดต่ำกว่า 16GB และเรนเดอร์ได้บน GPU สมัยใหม่ จากนั้นก็เป็นเรื่องของการปรับแต่งอีกหลายปี ระหว่างรอให้สมรรถนะระดับ H100 กลายเป็นของผู้บริโภคทั่วไป
สนุกเสมอเวลาวิทยาศาสตร์ก้าวข้ามความคาดหวังของนิยายวิทยาศาสตร์
ในกรณีนี้นึกถึงแนวคิด Braindance ใน Cyberpunk 2077 ทันที ซึ่งเป็นฟีเจอร์ที่ให้เดินสำรวจความทรงจำทางสายตาของคนอื่นได้ ภายในขอบเขตที่คนนั้นรับรู้ฉากนั้น
เมื่อย้ายกล้องไปยังตำแหน่งอื่นจากมุมมองเดิม ภาพจะพังทลายเหมือนก้อนพิกเซลสามมิติ คล้ายกับแนวคิด blob ที่นี่ แต่ที่น่าทึ่งคือมันดูขัดเกลาน้อยกว่าบทความนี้มาก
https://steelseries.com/blog/how-to-braindance-cyberpunk-207...
Splatting ใน volume rendering เป็นเทคนิคที่มีมานานพอสมควรแล้ว มีบทความเมื่อเดือนกรกฎาคม 1991 ของ Westover, Lee Alan ชื่อ “SPLATTING: A Parallel, Feed-Forward Volume Rendering Algorithm”
อย่างหลังดูไม่มีใครพยายามปิดบัง ส่วนอย่างแรกดูไม่น่าถูกต้อง
ไม่รู้ว่า insight นั้นมาจากไหน แต่ตอนนั้นผมอยู่แถวบอสตันและมีลูกเล็ก ๆ
รอคอยการใช้งาน WebGPU แบบ native ที่ปรับแต่งมาโดยเฉพาะตัวแรกสำหรับ การเรนเดอร์ 3DGS
ยังสงสัยด้วยว่าจะบีบอัดและคลายการบีบอัดข้อมูลฉากอย่างมีประสิทธิภาพได้อย่างไร
ผมทิ้งโน้ตเกี่ยวกับคำถามนี้ไว้เล็กน้อยในเธรด Zulip: https://xi.zulipchat.com/#narrow/stream/197075-gpu/topic/Gau...
เมื่อเร็ว ๆ นี้ผมได้ดูวิดีโอที่แสดงวิธีใช้ Gaussian splatting: Getting Started With 3D Gaussian Splats for Windows (Beginner Guide) - https://www.youtube.com/watch?v=UXtuigy_wYc
อยากรู้ว่าสถานะล่าสุดของ การกู้คืนโครงสร้างจากการเคลื่อนที่ เป็นอย่างไร
เมื่อมีวิดีโอของพื้นที่หนึ่ง ตอนนี้ในทางปฏิบัติเขาแปลงมันเป็นฉาก 3D กันอย่างไร
อินพุตของกระบวนการสร้างฉากใหม่ที่อธิบายในงานวิจัยนี้ก็คือสิ่งนั้น
เท่าที่รู้ แนวทางพื้นฐานของ SfM แทบไม่ได้เปลี่ยนไปมากนักในช่วงราว 10 ปีที่ผ่านมา และสรุปได้ว่าเป็นการสกัดฟีเจอร์ของภาพอย่าง SIFT, การจับคู่ด้วยฮิวริสติก, bundle adjustment และการกำจัด outlier
photogrammetry ทั่วไปคือคำตอบ และความสนใจรวมถึงความใช้งานได้จริงของแนวทางแบบ NeRF ก็เพิ่มขึ้นเรื่อย ๆ
แต่ก็น่าแปลกที่ความสัมพันธ์เชิงพื้นที่เพิ่มเติมซึ่งอนุมานได้จากความเป็นวิดีโอเพียงอย่างเดียวกลับไม่ได้รับความสนใจมากกว่านี้ น่าจะใช้ข้อจำกัดที่ว่ากล้องสามารถเคลื่อนที่ระหว่างเฟรมได้เฉพาะบางรูปแบบในการประมาณท่าทางของกล้องได้
มีแนวคิดที่จะรัน marching cubes บน Gaussian ที่ถูก splat เพื่อดึง mesh ออกมา แต่เหมือนว่ายังไม่เคยเห็นกรณีที่ทำจริง
ช่วงปลายยุค 90 เคยเรนเดอร์พื้นผิวระดับเดียวของ voxel ด้วย blob
สแกน surface voxel จากอาร์เรย์ voxel 3D ทั้งหมด คำนวณ normal ด้วย gradient ความหนาแน่นเฉพาะที่ แล้ว quantize ให้เป็นหนึ่งใน 240 ค่า
จากนั้นใช้ตาราง displacement vector เพื่อสร้าง chain ของ surface voxel และ voxel ส่วนใหญ่มีขนาด 2 ไบต์ คือ displacement index จาก voxel ก่อนหน้าและ normal vector index
แสงสำหรับ normal vector ทั้ง 240 ค่าได้รับการคำนวณล่วงหน้าและใส่ไว้ใน lookup table ทำให้ซอฟต์แวร์สามารถระบายวงกลมสีเล็ก ๆ ลงใน z-buffer ได้เร็วมาก
สิ่งที่เสียดายมากในตอนนั้นคือใช้ perspective ไม่ได้ เพราะแปลง displacement vector เป็นพิกัดหน้าจอทุกเฟรม จึงเป็นลักษณะระบาย blob, เลื่อน offset, lookup สี แล้วก็ระบายอีก มีค่า displacement หนึ่งค่าที่ใช้ระบุจุดจบของ chain และตำแหน่ง absolute ถัดไป แต่ voxel ส่วนใหญ่มีขนาด 2 ไบต์