Upgrade to Pro — share decks privately, control downloads, hide ads and more …

3Dシーンの圧縮

 3Dシーンの圧縮

頂点配列が大きすぎてロードするのもGPU上で処理するのも辛いので、圧縮します
これは2026年5月30日に行われた Kernel/VM探検隊@関西 12回目 での発表動画です
発表動画 :
ソースコード : https://github.com/Fadis/gct/

Avatar for Fadis

Fadis

May 28, 2026

More Decks by Fadis

Other Decks in Programming

Transcript

  1. texturesmuros_e.dds texturesmuros_a.dds texturesmuros_d.dds texturesmuros_g.dds texturesmuros_h.dds texturesmuros_p_.dds texturesBarro_2.dds texturesmuros_q.dds ... texturesFL15stm.dds

    texturesfuente_azulejo.dds texturesFL12pis1.dds san_miguel.bin san_miguel.gltf 438,616KB ςΫενϟ 534,696KB ௖఺഑ྻ 2,700KB ϊʔυπϦʔͱ ϚςϦΞϧ 976,012KB ߹ܭ Ͱ͔͍ͷ͸ ςΫενϟͱ௖఺഑ྻ
  2. texturesmuros_e.dds texturesmuros_a.dds texturesmuros_d.dds texturesmuros_g.dds texturesmuros_h.dds texturesmuros_p_.dds texturesBarro_2.dds texturesmuros_q.dds ... texturesFL15stm.dds

    texturesfuente_azulejo.dds texturesFL12pis1.dds san_miguel.bin san_miguel.gltf 438,616KB ςΫενϟ 534,696KB ௖఺഑ྻ 2,700KB ϊʔυπϦʔͱ ϚςϦΞϧ 976,012KB ߹ܭ 110,572KB ςΫενϟ 647,968KB ߹ܭ BC7Ͱѹॖ
  3. texturesmuros_e.dds texturesmuros_a.dds texturesmuros_d.dds texturesmuros_g.dds texturesmuros_h.dds texturesmuros_p_.dds texturesBarro_2.dds texturesmuros_q.dds ... texturesFL15stm.dds

    texturesfuente_azulejo.dds texturesFL12pis1.dds san_miguel.bin san_miguel.gltf 534,696KB ௖఺഑ྻ 2,700KB ϊʔυπϦʔͱ ϚςϦΞϧ 110,572KB ςΫενϟ 647,968KB ߹ܭ ௖఺഑ྻ΋ѹॖ͍ͨ͠
  4. ά ϥ ϑ Ϋ ε ύ Π ϓ ϥ Π

    ϯ ϐΫηϧॲཧ ௖఺ॲཧ ϥελϥΠβ ϑϥάϝϯτγΣʔμʔ ΧϥʔϒϨϯυ λεΫγΣʔμʔ ϝογϡγΣʔμʔ vkCmdDrawMeshTasksEXT
  5. ά ϥ ϑ Ϋ ε ύ Π ϓ ϥ Π

    ϯ ϐΫηϧॲཧ ௖఺ॲཧ ϥελϥΠβ ϑϥάϝϯτγΣʔμʔ ΧϥʔϒϨϯυ λεΫγΣʔμʔ ϝογϡγΣʔμʔ vkCmdDrawMeshTasksEXT ϝογϡγΣʔμʔ ϥελϥΠβʹ౉͢ ࡾ֯ܗͷϦετΛੜ੒͢Δ
  6. ά ϥ ϑ Ϋ ε ύ Π ϓ ϥ Π

    ϯ ϐΫηϧॲཧ ௖఺ॲཧ ϥελϥΠβ ϑϥάϝϯτγΣʔμʔ ΧϥʔϒϨϯυ λεΫγΣʔμʔ ϝογϡγΣʔμʔ vkCmdDrawMeshTasksEXT λεΫγΣʔμʔ ϝογϡγΣʔμʔΛ ԿεϨου࣮ߦ͢Δ͔ΛܾΊΔ
  7. ά ϥ ϑ Ϋ ε ύ Π ϓ ϥ Π

    ϯ ϐΫηϧॲཧ ௖఺ॲཧ ϥελϥΠβ ϑϥάϝϯτγΣʔμʔ ΧϥʔϒϨϯυ λεΫγΣʔμʔ ϝογϡγΣʔμʔ vkCmdDrawMeshTasksEXT ϑϥάϝϯτγΣʔμʔ ࡾ֯ܗͷൣғ಺ͷϐΫηϧΛ Կ৭ͰృΔ͔ΛܾΊΔ
  8. Joshua Barczak, Carsten Benthin, and David McAllister. 2024. DGF: A

    Dense, Hardware-Friendly Geometry Format for Lossily Compressing Meshlets with Arbitrary Topologies. Proc. ACM Comput. Graph. Interact. Tech. 7, 3, Article 46 (August 2024), 17 pages. https://doi.org/10.1145/3675383 Dense Geometry Format
  9. 0 1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
  10. 0 1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 0, 3, 5 0, 5, 6 0, 6, 1 1, 6, 7 1, 7, 2 3, 4, 5 4, 8, 10 4, 10, 5 5, 10, 6 6, 10, 13 6, 13, 7 ⋮ ௖఺ΠϯσοΫε Կ൪໨ͷ௖఺Λܨ͍Ͱ ࡾ֯ܗΛ࡞Δ͔Λࢦఆ͢Δ
  11. meshlet 197 face_count=27 face 0 p(-0.390625,0.101562,-1.27344) p(-0.34375,0.046875,-1.27344) p(-0.382812,0.03125,-1.27344) face 1

    p(-0.390625,0.101562,-1.27344) p(-0.382812,0.03125,-1.27344) p(-0.445312,0.0625,-1.27344) face 2 p(-0.390625,0.101562,-1.27344) p(-0.445312,0.0625,-1.27344) p(-0.453125,0.132812,-1.27344) face 3 p(-0.453125,0.132812,-1.27344) p(-0.445312,0.0625,-1.27344) p(-0.507812,0.0625,-1.27344) face 4 p(-0.453125,0.132812,-1.27344) p(-0.507812,0.0625,-1.27344) p(-0.5,0.148438,-1.27344) face 5 p(-0.5,0.148438,-1.27344) p(-0.507812,0.0625,-1.27344) p(-0.570312,0.0703125,-1.26562) face 6 p(-0.5,0.148438,-1.27344) p(-0.570312,0.0703125,-1.26562) p(-0.546875,0.171875,-1.26562) [ 0.08449, -0.01446, -0.00347] [ 0.13136, -0.06915, -0.00347] [ 0.09230, -0.08478, -0.00347] [ 0.08449, -0.01446, -0.00347] [ 0.09230, -0.08478, -0.00347] [ 0.02980, -0.05353, -0.00347] [ 0.08449, -0.01446, -0.00347] [ 0.02980, -0.05353, -0.00347] [ 0.02199, 0.01678, -0.00347] [ 0.02199, 0.01678, -0.00347] [ 0.02980, -0.05353, -0.00347] [-0.03269, -0.05353, -0.00347] [ 0.02199, 0.01678, -0.00347] [-0.03269, -0.05353, -0.00347] [-0.02488, 0.03240, -0.00347] [-0.02488, 0.03240, -0.00347] [-0.03269, -0.05353, -0.00347] [-0.09519, -0.04571, 0.00434] [-0.02488, 0.03240, -0.00347] [-0.09519, -0.04571, 0.00434] [-0.07175, 0.05584, 0.00434] [-0.47511, 0.11603, -1.26996] = + ϝογϡϨοτͷத৺ ͔ͦ͜Βͷࠩ෼ খ͍͞
  12. P = 2S−127 (A + 215−Bd) ௖఺࠲ඪ ϝογϡϨοτ಺ͷ௖఺Ͱ ڞ௨ͷࢦ਺෦(scale) ج४ͱͳΔ௖఺ͷ࠲ඪͷ

    Ծ਺෦(anchor) ௖఺ຖͷΦϑηοτ ௖఺ຖͷΦϑηοτͷ Ϗοτ਺ શ௖఺ڞ௨ ௖఺ຖͷ஋
  13. bits 0 1 2 3 4 5 6 7 0

    8 bitsPerIndex numVerts 16 numTriangles geomIDMeta 24 geomIDMeta 32 40 48 56 64 72 80 88 96 haveGeomI DPalette 104 112 120 128 primIDBase 136 144 152 haveUser Data primIDBase 160 userData 168 176 184 P = 2S−127 (A + 215−Bd) Ax Ay Az S Bx By Bz 0 24 128 ϒϩοΫ ͱ ͱ ͸ϝογϡϨοτ಺Ͱݻఆ ϒϩοΫͷઌ಄24όΠτͷ ϔομͷதʹه࿥͢Δ A B S
  14. 0 24 128 bits 0 1 2 3 4 5

    6 7 0 8 bitsPerIndex numVerts 16 numTriangles geomIDMeta 24 geomIDMeta 32 40 48 56 64 72 80 88 96 haveGeomI DPalette 104 112 120 128 primIDBase 136 144 152 haveUser Data primIDBase 160 userData 168 176 184 Ax Ay Az S Bx By Bz P = 2S−127 (A + 215−Bd)
  15. 0 1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
  16. 0 1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 0, 3, 5 0, 5, 6 0, 6, 1 1, 6, 7 1, 7, 2 3, 4, 5 4, 8, 10 4, 10, 5 5, 10, 6 6, 10, 13 6, 13, 7 ⋮ ௖఺ΠϯσοΫε Կ൪໨ͷ௖఺Λܨ͍Ͱ ࡾ֯ܗΛ࡞Δ͔Λࢦఆ͢Δ
  17. 0 1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 0, 3, 5 0, 5, 6 0, 6, 1 1, 6, 7 1, 7, 2 3, 4, 5 4, 8, 10 4, 10, 5 5, 10, 6 6, 10, 13 6, 13, 7 ⋮ Ͱ͔͍ ݸͷ ੔਺஋ numTriangles × 3
  18. 0 1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 0, 3, 5 0, 5, 6 0, 6, 1 1, 6, 7 1, 7, 2 3, 4, 5 4, 8, 10 4, 10, 5 5, 10, 6 6, 10, 13 6, 13, 7 ⋮ ಉ͡஋͕ Կ౓΋ग़ͯ͘Δ
  19. p0 p1 p2 ൪໨ͷࡾ֯ܗ n − 2 ลͰྡΓ߹͏ࡾ֯ܗͷγʔέϯε͸ 1ࡾ֯ܗ͋ͨΓ1௖఺ͰදͤΔ p3

    ൪໨ͷࡾ֯ܗ ͷӈଆͷลͱྡ઀͠ Λ௨Δ n − 1 n − 2 p3 p4 ൪໨ͷࡾ֯ܗ ͷࠨଆͷลͱྡ઀͠ Λ௨Δ n n − 1 p4
  20. p0 p1 p2 p3 p4 ൪໨ͷࡾ֯ܗ n − 2 ൪໨ͷࡾ֯ܗ

    ͷӈଆͷลͱྡ઀͠ Λ௨Δ n − 1 n − 2 p3 ൪໨ͷࡾ֯ܗ ͷࠨଆͷลͱྡ઀͠ Λ௨Δ n n − 1 p4 ࠨ઀ଓ ӈ઀ଓ
  21. 0 3 4 5 6 7 8 9 10 11

    12 13 14 15 16 17 18 19 20 21 22 23 24 14, 17, 9, 12, 8, 10, 4, 5, 3, 0, 6, 10, 13, 7, 11, 15, 16, 24, 23, 22, 13, 19, 10, 12, 18, 17, 20, 21, 19, 22, 23 ӈ, ࠨ, ӈ, ࠨ, ӈ, ࠨ, ӈ, ӈ, ӈ, ࠨ, ࠨ, ӈ, ӈ, ࠨ, ӈ, ӈ, ӈ, ӈ, ࠨ, ӈ, ࠨ, ࠨ, ӈ, ࠨ, ࠨ, ࠨ, ӈ, ӈ ௖఺ͷγʔέϯε ઀ଓํ޲
  22. 0 3 4 5 6 7 8 9 10 11

    12 13 14 15 16 17 18 19 20 21 22 23 24 Generalized Triangle Strip Michael Deering. 1995. Geometry compression. In Proceedings of the 22nd annual conference on Computer graphics and interactive techniques (SIGGRAPH '95). Association for Computing Machinery, New York, NY, USA, 13–20. https://doi.org/ 10.1145/218380.218391
  23. p0 p1 p2 p3 p4 p5 , , , ,

    , p0 p1 p2 p3 p4 p5 ӈ, ࠨ, backtrack ௖఺ͷγʔέϯε ઀ଓํ޲ backtrack 1ͭલͷࡾ֯ܗͷ બ͹ͳ͔ͬͨํͷลͷઌʹ ৽͍͠ࡾ֯ܗΛ࡞Δ
  24. p0 p1 p2 p3 p4 p5 p6 p7 p8 ,

    , , , , , , , p0 p1 p2 p3 p4 p5 p6 p7 p8 ӈ, ࠨ, restart, ӈ ௖఺ͷγʔέϯε ઀ଓํ޲ restart 1ͭલͷࡾ֯ܗͷࣄ͸๨Εͯ ௖఺ͷγʔέϯε͔Β 3ཁૉरͬͯࡾ֯ܗΛ࡞Δ
  25. 0 1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 14, 17, 9, 12, 8, 10, 4, 5, 3, 0, 6, 10, 13, 7, 11, 15, 16, 24, 23, 22, 13, 19, 10, 12, 18, 17, 20, 21, 19, 22, 23, 0, 6, 1, 7, 2 ӈ, ࠨ, ӈ, ࠨ, ӈ, ࠨ, ӈ, ӈ, ӈ, ࠨ, ࠨ, ӈ, ӈ, ࠨ, ӈ, ӈ, ӈ, ӈ, ࠨ, ӈ, ࠨ, ࠨ, ӈ, ࠨ, ࠨ, ࠨ, ӈ, ӈ, restart, ӈ, ࠨ ௖఺ͷγʔέϯε ઀ଓํ޲ ͲΜͳࡾ֯ܗؚ͕·Ε͍ͯͯ΋දݱͰ͖Δ
  26. ӈ, ࠨ, ӈ, ࠨ, ӈ, ࠨ, ӈ, ӈ, ӈ, ࠨ,

    ࠨ, ӈ, ӈ, ࠨ, ӈ, ӈ, ӈ, ӈ, ࠨ, ӈ, ࠨ, ࠨ, ӈ, ࠨ, ࠨ, ࠨ, ӈ, ӈ, restart, ӈ, ࠨ SFTUBSU 0b00 ӈ 0b01 ࠨ 0b10 CBDLUSBDL 0b11 ઀ଓํ޲ ઀ଓํ๏͸4छྨͳͷͰ 2bitͰදͤΔ Triangle Control 01 10 01 10 01 10 01 01 01 10 10 01 01 10 01 01 01 01 10 01 10 10 01 10 10 10 01 01 00 01 10
  27. 0 1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 14, 17, 9, 12, 8, 10, 4, 5, 3, 0, 6, 10, 13, 7, 11, 15, 16, 24, 23, 22, 13, 19, 10, 12, 18, 17, 20, 21, 19, 22, 23, 0, 6, 1, 7, 2 ௖఺ͷγʔέϯε ઀ଓํ޲ 01 10 01 10 01 10 01 01 01 10 10 01 01 10 01 01 01 01 10 01 10 10 01 10 10 10 01 01 00 01 10 Ͱ͔͍
  28. 9 23 24 8 6 7 10 12 4 2

    5 13 3 11 0 14 15 1 20 19 21 22 18 17 16 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 11, 12, 13, 14, 15, 16, 17, 18, 11, 19, 5, 3, 20, 1, 21, 22, 19, 18, 17, 9, 10, 23, 12, 24 ௖఺ͷγʔέϯε ௖఺Λ࢖͏ॱʹιʔτ ಉ͡௖఺͕࠶ར༻͞ΕΔ৔߹Λআ͍ͯ γʔέϯεͷ஋͸1ͮͭ૿Ճ͢Δ
  29. 9 23 24 8 6 7 10 12 4 2

    5 13 3 11 0 14 15 1 20 19 21 22 18 17 16 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 11, 12, 13, 14, 15, 16, 17, 18, 11, 19, 5, 3, 20, 1, 21, 22, 19, 18, 17, 9, 10, 23, 12, 24 ௖఺ͷγʔέϯε First-Index Bits 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1 ॳొ৔ͩͬͨΒ1
  30. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

    10, 5, 11, 12, 13, 14, 15, 16, 17, 18, 11, 19, 5, 3, 20, 1, 21, 22, 19, 18, 17, 9, 10, 23, 12, 24 ௖఺ͷγʔέϯε First-Index Bits 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1 5, 7, 14, 16, 19, 3, 4, 5, 13, 12, 11 10 − 5 = 5 18 − 11 = 7 ௚ۙͷॳΊͯొ৔ͨ͠஋ͱ ࠶ར༻͢Δ஋ͷࠩΛه࿥ Reuse Buffer
  31. bits 0 1 2 3 4 5 6 7 0

    8 bitsPerIndex numVerts 16 numTriangles geomIDMeta 24 geomIDMeta 32 40 48 56 64 72 80 88 96 haveGeomI DPalette 104 112 120 128 primIDBase 136 144 152 haveUser Data primIDBase 160 userData 168 176 184 Ax Ay Az S Bx By Bz 00101 00111 01110 10000 10011 00011 00100 00101 01101 01100 01011 Reuse Buffer 5, 7, 14, 16, 19, 3, 4, 5, 13, 12, 11 ௖఺͋ͨΓCJU 0b00 ௖఺͋ͨΓCJU 0b01 ௖఺͋ͨΓCJU 0b10 ௖఺͋ͨΓCJU 0b11 0b10
  32. ϔομ 0 24 128 0 3 4 5 6 7

    8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ͜ͷ޲͖Ͱฒ΂Δ 00101 00111 01110 10000 10011 00011 00100 00101 01101 01100 01011 Reuse Buffer ௖఺ͷΦϑηοτd 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1 First-Index Bits 01 10 01 10 01 10 01 01 01 10 10 01 01 10 01 01 01 01 10 01 10 10 01 10 10 10 01 01 00 01 10 Triangle Control
  33. ά ϥ ϑ Ϋ ε ύ Π ϓ ϥ Π

    ϯ ϐΫηϧॲཧ ௖఺ॲཧ ϥελϥΠβ ϑϥάϝϯτγΣʔμʔ ΧϥʔϒϨϯυ λεΫγΣʔμʔ ϝογϡγΣʔμʔ vkCmdDrawMeshTasksEXT ͜ΕΛϝογϡγΣʔμʔͰ ϩʔυͯ͠ల։͢Δ
  34. αϒάϧʔϓ ڞ༗ϝϞϦ ৸Δ ͜ͷൣғ಺ͷεϨου͸ ڞ༗ϝϞϦΛ࢖Θͣʹ ஋Λड͚౉ͤΔ NVIDIA GPUͷ৔߹ : 32εϨου

    AMD GPUͷ৔߹ : 32εϨου ϝογϡγΣʔμʔ͸௨ৗ 1ϩʔΧϧϫʔΫάϧʔϓ͋ͨΓ 1αϒάϧʔϓͰ࣮ߦ͞ΕΔ ࠷ۙͷ ͜ͷ΁ΜͷεϨου͸ ڞ༗ϝϞϦ͕ຒ·͍ͬͯΔͷͰ ࿈ܞͰ͖ͳ͍
  35. ӈ, ࠨ, ӈ, ࠨ, ӈ, ࠨ, ӈ, ӈ, ӈ, ࠨ,

    ࠨ, ӈ, ӈ, ࠨ, ӈ, ӈ, ӈ, ӈ, ࠨ, ӈ, ࠨ, ࠨ, ӈ, ࠨ, ࠨ, ࠨ, ӈ, ӈ, restart, ӈ, ࠨ Triangle Control ࠷ॳͷࡾ֯ܗ͸ඞͣ 3ͭͷ௖఺͕ඞཁͳͷͰ ͜͜ʹ҉໧ͷrestart͕͋Δ restart,
  36. ӈ, ࠨ, ӈ, ࠨ, ӈ, ࠨ, ӈ, ӈ, ӈ, ࠨ,

    ࠨ, ӈ, ӈ, ࠨ, ӈ, ӈ, ӈ, ӈ, ࠨ, ӈ, ࠨ, ࠨ, ӈ, ࠨ, ࠨ, ࠨ, ӈ, ӈ, restart, ӈ, ࠨ Triangle Control restart, ௖఺Λ3ݸ࢖͏ ௖఺Λ1ݸ࢖͏ ௖఺Λ1ݸ࢖͏ ௖఺Λ3ݸ࢖͏ restart͸௖఺ͷγʔέϯεΛ3ཁૉফඅ͠ ͦΕҎ֎͸1ཁૉফඅ͢Δ
  37. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 subgroupBallotͰ֤εϨου͕σίʔυ͠Α͏ͱ͍ͯ͠Δࡾ֯ܗ͕ restart͔Ͳ͏͔Λௐ΂Δ 1, ൪໨ͷεϨου͸ ࣗ਎ͷϏοτΑΓલʹཱ͍ͬͯΔrestartͷϏοτͷ਺ Ͱ ௖఺ͷγʔέϯεͷΦϑηοτ͕ٻ·Δ n n+ × 2
  38. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

    10, 5, 11, 12, 13, 14, 15, 16, 17, 18, 11, 19, 5, 3, 20, 1, 21, 22, 19, 18, 17, 9, 10, 23, 12, 24 ਖ਼͍͠௖఺ͷγʔέϯε 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 19, 19, 19, 20, 20, 21, 22, 22, 22, 22, 22, 22, 23, 23, 24 first-index bitsΛbitCountͨ͠΋ͷ ௖఺γʔέϯεͷΦϑηοτ ΑΓલʹ͋Δfirst-index bitsͷϏοτྻΛ bitCount ෦෼తʹਖ਼͍͠௖఺ͷγʔέϯε͕ಘΒΕΔ ௖఺Λ࠶ར༻͍ͯ͠ΔՕॴͷ ஋͕͓͔͍͠
  39. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

    0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 4, 4, 5, 5, 5, 6, 7, 8, 9, 10, 10, 11 first-index bitsΛ൓సͯ͠bitCountͨ͠΋ͷ ௖఺γʔέϯεͷΦϑηοτ ΑΓલʹ͋Δfirst-index bitsͷϏοτྻΛ ൓సͯ͠bitCount Reuse BufferͷԿཁૉ໨ͷ஋Ͱ ௖఺γʔέϯεͷΦϑηοτΛ मਖ਼͢΂͖͔͕ٻ·Δ 5, 7, 14, 16, 19, 3, 4, 5, 13, 12, 11 Reuse Buffer
  40. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

    10, 5, 11, 12, 13, 14, 15, 16, 17, 18, 11, 19, 5, 3, 20, 1, 21, 22, 19, 18, 17, 9, 10, 23, 12, 24 ਖ਼͍͠௖఺ͷγʔέϯε 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 11, 12, 13, 14, 15, 16, 17, 18, 11, 19, 5, 3, 20, 1, 21, 22, 19, 18, 17, 9, 10, 23, 12, 24 Reuse Bufferͷ஋ΛҾ͍ͨ΋ͷ Reuse Bufferͷ஋Ͱ ෦෼తʹਖ਼͍͠௖఺ͷγʔέϯεΛमਖ਼ ਖ਼͍͠௖఺ͷγʔέϯε͕ಘΒΕΔ
  41. Pn = 2S−127 (A + 215−Bdin ) 0, 1, 2,

    3, 4, 5, 6, 7, 8, 9, 10, 5, 11, 12, 13, 14, 15, 16, 17, 18, 11, 19, 5, 3, 20, 1, 21, 22, 19, 18, 17, 9, 10, 23, 12, 24 in = ϔομ d0 , d1 , d2 ⋯
  42. ࠲ඪ ๏ઢ ઀ઢ ςΫενϟ࠲ඪ ΠϯσοΫε texturesmuros_e.dds texturesmuros_a.dds texturesmuros_d.dds texturesmuros_g.dds texturesmuros_h.dds

    texturesmuros_p_.dds texturesBarro_2.dds texturesmuros_q.dds ... texturesFL15stm.dds texturesfuente_azulejo.dds texturesFL12pis1.dds san_miguel.bin san_miguel.gltf 534,696KB ௖఺഑ྻ DGF 110,572KB ςΫενϟ 647,968KB ߹ܭ 2,700KB ϊʔυπϦʔͱ ϚςϦΞϧ
  43. meshlet 197 face_count=27 face 0 p(-0.390625,0.101562,-1.27344) -> p(-0.34375,0.046875,-1.27344) -> p(-0.382812,0.03125,-1.27344)

    -> face 1 p(-0.390625,0.101562,-1.27344) -> p(-0.382812,0.03125,-1.27344) -> p(-0.445312,0.0625,-1.27344) -> face 2 p(-0.390625,0.101562,-1.27344) -> p(-0.445312,0.0625,-1.27344) -> p(-0.453125,0.132812,-1.27344) -> face 3 p(-0.453125,0.132812,-1.27344) -> p(-0.445312,0.0625,-1.27344) -> p(-0.507812,0.0625,-1.27344) -> face 4 p(-0.453125,0.132812,-1.27344) -> p(-0.507812,0.0625,-1.27344) -> p(-0.5,0.148438,-1.27344) -> face 5 p(-0.5,0.148438,-1.27344) -> p(-0.507812,0.0625,-1.27344) -> p(-0.570312,0.0703125,-1.26562) -> face 6 p(-0.5,0.148438,-1.27344) -> p(-0.570312,0.0703125,-1.26562) -> p(-0.546875,0.171875,-1.26562) -> n(0.0968003,0.0200001,-0.995103) n(0.0849038,0.187208,-0.978644) n(-0.0247003,-0.0341004,-0.999113) n(0.0192,-0.0493,-0.9986) n(0.00519997,0.0545997,-0.998495) n(-0.0854998,-0.0383999,-0.995598) n(-0.0883036,0.106904,-0.99034) n(-0.225499,-0.0429997,-0.973294) n(-0.179595,0.163996,-0.969975) 0 1 2 0 2 3 0 3 4 4 3 5 4 5 6 6 5 7 6 7 8 ࠲ඪͱͦΕҎ֎ͷ஋Λ݁Ϳ ΠϯσοΫεΛ࡞Δ
  44. × 25 × 21 × 7 ⋮ × 24 ×

    25 × 24 × 20 × 27 ͜ͷϒϩοΫͷΠϯσοΫεΛಡΈ͍ͨ ͬͯ͜͜ઌ಄͔Β Կཁૉ໨? ΠϯσοΫε
  45. × 25 × 21 × 7 ⋮ × 24 ×

    25 × 24 × 20 × 27 ઌ಄͔Β146ཁૉ໨ userDataʹ ͜ͷϝογϡϨοτͷલʹ ͍ͭ͘ ͕͋Δ͔Λ ॻ͍͓ͯ͘ userData ϔομͷ࠷ޙͷ4όΠτ͸ ೚ҙͷσʔλΛॻ͍ͯྑ͍
  46. { "bufferView": 2, "componentType": 5120, "count": 67, "extensions": { "GCT_EXTENDED_TYPE":

    { "block_count": 4, "component_size": 128, "decoded_component_count": 3, "type": "DGF" } }, "max": [ 0.828125, 0.5390625, 0.015625 ], "min": [ -0.703125, -0.671875, -1.5859375 ], "type": "SCALAR" }, 1ཁૉ128όΠτͷ DGFܕͷϒϩοΫ͕ 4ݸฒΜͰ͍Δ σίʔυ͢Δͱ3ཁૉͷϕΫτϧʹͳΔ
  47. std::uint32_t to_size( fx::gltf::Accessor::ComponentType componentType, fx::gltf::Accessor::Type type ) { return to_size(

    componentType ) * to_size( type ); } std::uint32_t to_size( const fx::gltf::Accessor &accessor ) { const bool has_extended_type = accessor.extensionsAndExtras.find( "extensions" ) != accessor.extensionsAndExtras.end() && accessor.extensionsAndExtras[ "extensions" ].find( "GCT_EXTENDED_TYPE" ) != accessor.extensionsAndExtras[ "extensions" ].end() && accessor.extensionsAndExtras[ "extensions" ][ "GCT_EXTENDED_TYPE" ].find( "type" ) != accessor.extensionsAndExtras[ "extensions" ][ "GCT_EXTENDED_TYPE" ].end(); if( has_extended_type ) { const std::string typestr = accessor.extensionsAndExtras[ "extensions" ][ "GCT_EXTENDED_TYPE" ][ "type" ]; const auto type_id = scene_graph::to_accessor_type_id( typestr ); const auto component_size = get_component_size( type_id ); const auto component_count = scene_graph::to_accessor_component_count( accessor ); return component_size * component_count; } return to_size( accessor.componentType, accessor.type ); } std::uint32_t get_block_count( const fx::gltf::Accessor &accessor ) { const bool has_extended_type = accessor.extensionsAndExtras.find( "extensions" ) != accessor.extensionsAndExtras.end() && accessor.extensionsAndExtras[ "extensions" ].find( "GCT_EXTENDED_TYPE" ) != accessor.extensionsAndExtras[ "extensions" ].end() && accessor.extensionsAndExtras[ "extensions" ][ "GCT_EXTENDED_TYPE" ].find( "block_count" ) != accessor.extensionsAndExtras[ "extensions" ][ "GCT_EXTENDED_TYPE" ].end(); if( has_extended_type ) { return accessor.extensionsAndExtras[ "extensions" ][ "GCT_EXTENDED_TYPE" ][ "block_count" ]; } return accessor.count; } https://github.com/Fadis/gct/blob/master/src/gct/gltf.cpp ֦ுܕ৘ใ͕͋ͬͨΒ ͦͬͪͷ৘ใΛฦ͢ ແ͔ͬͨΒඪ४ͷܕͷ৘ใΛฦ͢
  48. face_attribute read_face_attribute( meshlet_reader reader, uint face_id ) { if( !reader.valid

    ) return null_face_attr; const mesh_type mesh = mesh_pool[ reader.mesh_id ]; const accessor_type normal_accessor = accessor_pool[ mesh.accessor + 2 ]; const accessor_type tangent_accessor = accessor_pool[ mesh.accessor + 3 ]; face_attribute f; uvec3 vertex_index; if( accessor_pool[ mesh.accessor + 1 ].type == GCT_SHADER_TYPE_ID_DGF ) { if( reader.dgf_info.header.numTriangles <= face_id ) return null_face_attr; uvec3 index; if( reader.wave_mode ) { index = DGFGetTriangle_BitScan_Wave( reader.dgf_info, face_id ); } else { index = DGFGetTriangle_BitScan_Lane( reader.dgf_info, face_id ); } for( uint i = 0u; i != 3u; ++i ) { f.vertex[ i ].position = vec4( DGFGetVertex( reader.dgf_info, index[ i ] ), 1.0f ); } f.primitive_id = reader.dgf_info.header.userData + face_id; const uint global_vertex_id = f.primitive_id * 3u; vertex_index = uvec3( read_index( accessor_pool[ mesh.accessor + 0 ], global_vertex_id + 0u ), read_index( accessor_pool[ mesh.accessor + 0 ], global_vertex_id + 1u ), read_index( accessor_pool[ mesh.accessor + 0 ], global_vertex_id + 2u ) ); } else { if( face_id >= reader.face_count ) return null_face_attr; f.primitive_id = ( reader.meshlet_id * 32u + face_id ); const uint global_vertex_id = f.primitive_id * 3u; vertex_index = uvec3( read_index( accessor_pool[ mesh.accessor + 0 ], global_vertex_id + 0u ), read_index( accessor_pool[ mesh.accessor + 0 ], global_vertex_id + 1u ), read_index( accessor_pool[ mesh.accessor + 0 ], global_vertex_id + 2u ) ); for( uint i = 0u; i != 3u; ++i ) { f.vertex[ i ].position = read_vertex( accessor_pool[ mesh.accessor + 1 ], vertex_index[ i ], vec4( 0.0, 0.0, 0.0, 1.0 ) ); } DGFͩͬͨΒ GLSLʹҠ২ͨ͠σίʔμͰల։ DGF͡Όͳ͔ͬͨΒ ͦͷ··௖఺഑ྻͷ಺༰ΛಡΉ
  49. $ ./src/meshconv -i ./san_miguel/san_miguel.gltf -c dgf:12 -c dedup -c meshlet_statistics

    -c mesh_statistics -o san_miguel/ san_miguel_dgf.gltf ... ϝογϡϨοτ౷ܭ ࠷খ : 1 ࠷େ : 32 ฏۉ : 12.6085 ϝογϡϨοτͷ਺ : 350647 ϝογϡ౷ܭ ௖఺਺ : 13263489 ϢχʔΫ௖఺਺ : 10640934 ௖఺ͷΦϑηοτ ͷ࠷େϏοτ਺12ͰDGFʹม׵ d
  50. texturesmuros_e.dds texturesmuros_a.dds texturesmuros_d.dds texturesmuros_g.dds texturesmuros_h.dds texturesmuros_p_.dds texturesBarro_2.dds texturesmuros_q.dds ... texturesFL15stm.dds

    texturesfuente_azulejo.dds texturesFL12pis1.dds san_miguel.bin san_miguel.gltf 534,696KB ௖఺഑ྻ 110,572KB ςΫενϟ 647,968KB ߹ܭ 2,700KB ϊʔυπϦʔͱ ϚςϦΞϧ 575,024KB ߹ܭ DGFͰѹॖ 461,752KB(86%) ௖఺഑ྻ
  51. texturesmuros_e.dds texturesmuros_a.dds texturesmuros_d.dds texturesmuros_g.dds texturesmuros_h.dds texturesmuros_p_.dds texturesBarro_2.dds texturesmuros_q.dds ... texturesFL15stm.dds

    texturesfuente_azulejo.dds texturesFL12pis1.dds san_miguel.bin san_miguel.gltf ௖఺഑ྻ ࠲ඪ ๏ઢ ઀ઢ ςΫενϟ࠲ඪ 110,572KB ςΫενϟ 575,024KB ߹ܭ 2,700KB ϊʔυπϦʔͱ ϚςϦΞϧ ΠϯσοΫε ͚ͩ͜͜ ѹॖͨ͠ 43,782KB(35%) 44,423KB(125%) 124,698KB 166,118KB 83,132KB etc. 461,752KB(86%)
  52. ௖఺഑ྻ ࠲ඪ ๏ઢ ઀ઢ ςΫενϟ࠲ඪ 110,572KB ςΫενϟ 575,024KB 2,700KB ϊʔυπϦʔͱ

    ϚςϦΞϧ ΠϯσοΫε 43,782KB(35%) 44,423KB(125%) 124,698KB 166,118KB 83,132KB etc. texturesmuros_e.dds texturesmuros_a.dds texturesmuros_d.dds texturesmuros_g.dds texturesmuros_h.dds texturesmuros_p_.dds texturesBarro_2.dds texturesmuros_q.dds ... texturesFL15stm.dds texturesfuente_azulejo.dds texturesFL12pis1.dds san_miguel.bin san_miguel.gltf ͜ΕΛ ѹॖ͍ͨ͠ ߹ܭ 461,752KB(86%)
  53. n(0.0968003,0.0200001,-0.995103) n(0.0849038,0.187208,-0.978644) n(-0.0247003,-0.0341004,-0.999113) n(0.0192,-0.0493,-0.9986) n(0.00519997,0.0545997,-0.998495) n(-0.0854998,-0.0383999,-0.995598) n(-0.0883036,0.106904,-0.99034) n(-0.225499,-0.0429997,-0.973294) n(-0.179595,0.163996,-0.969975) meshlet

    197 face_count=27 face 0 p(-0.390625,0.101562,-1.27344) -> p(-0.34375,0.046875,-1.27344) -> p(-0.382812,0.03125,-1.27344) -> face 1 p(-0.390625,0.101562,-1.27344) -> p(-0.382812,0.03125,-1.27344) -> p(-0.445312,0.0625,-1.27344) -> face 2 p(-0.390625,0.101562,-1.27344) -> p(-0.445312,0.0625,-1.27344) -> p(-0.453125,0.132812,-1.27344) -> face 3 p(-0.453125,0.132812,-1.27344) -> p(-0.445312,0.0625,-1.27344) -> p(-0.507812,0.0625,-1.27344) -> face 4 p(-0.453125,0.132812,-1.27344) -> p(-0.507812,0.0625,-1.27344) -> p(-0.5,0.148438,-1.27344) -> face 5 p(-0.5,0.148438,-1.27344) -> p(-0.507812,0.0625,-1.27344) -> p(-0.570312,0.0703125,-1.26562) -> face 6 p(-0.5,0.148438,-1.27344) -> p(-0.570312,0.0703125,-1.26562) -> p(-0.546875,0.171875,-1.26562) -> 0 1 2 0 2 3 0 3 4 4 3 5 4 5 6 6 5 7 6 7 8 ๏ઢ 3ཁૉͷුಈখ਺఺਺ͷϕΫτϧ ৗʹ୯Ґ௕
  54. cos (θ) ≃ 1 − θ2 2! + θ4 4!

    − θ6 6! + θ8 8! − θ10 10! ⋯ Λ਺஋తʹٻΊΔ cos (θ) ຖϑϨʔϜ௖఺ຖʹ͜ΜͳܭࢉΛͨ͘͠ͳ͍
  55. u v u v ද ཪ s = 0 s

    = 1 ീ໘ମΤϯίʔσΟϯά (u, v, s)
  56. (u, v, s) 31 0 n20t11b1 t ූ߸ ઈର஋ ๏ઢ

    ઀ઢ ӈखܥͳΒ0 ࠨखܥͳΒ1
  57. 212,843KB(39%) 43,782KB(35%) 44,423KB(125%) texturesmuros_e.dds texturesmuros_a.dds texturesmuros_d.dds texturesmuros_g.dds texturesmuros_h.dds texturesmuros_p_.dds texturesBarro_2.dds

    texturesmuros_q.dds ... texturesFL15stm.dds texturesfuente_azulejo.dds texturesFL12pis1.dds san_miguel.bin san_miguel.gltf ௖఺഑ྻ ࠲ඪ ๏ઢ ઀ઢ ςΫενϟ࠲ඪ 110,572KB ςΫενϟ 326,115KB ߹ܭ 2,700KB ϊʔυπϦʔͱ ϚςϦΞϧ ΠϯσοΫε 41,592KB(33%) 0KB(0%) 83,132KB etc.
  58. 212,843KB(39%) 43,782KB(35%) 44,423KB(125%) ௖఺഑ྻ ࠲ඪ ๏ઢ ઀ઢ ςΫενϟ࠲ඪ 110,572KB ςΫενϟ

    326,115KB ߹ܭ 2,700KB ϊʔυπϦʔͱ ϚςϦΞϧ ΠϯσοΫε 41,592KB(33%) 0KB(0%) 83,132KB etc. texturesmuros_e.dds texturesmuros_a.dds texturesmuros_d.dds texturesmuros_g.dds texturesmuros_h.dds texturesmuros_p_.dds texturesBarro_2.dds texturesmuros_q.dds ... texturesFL15stm.dds texturesfuente_azulejo.dds texturesFL12pis1.dds san_miguel.bin san_miguel.gltf ͜ΕΛ ѹॖ͍ͨ͠
  59. ϝογϡશମΛ෴͏λΠϓ ͔Β ·Ͱͷ ஋͔͠ग़ͯ͜ͳ͍ (0,0) (1,1) fixed ࠨӈରশͳ෺ͷ൒෼͚͕ͩ ඳ͔Ε͍ͯΔλΠϓ ͔Β

    ·Ͱͷ ஋͔͠ग़ͯ͜ͳ͍ (−1, − 1) (2,2) fixed ಉ͡ύλʔϯΛ܁Γฦ͠ షΓ෇͚ΔλΠϓ ςΫενϟ࠲ඪͷਫ਼౓͸ ͦ͜·ͰॏཁͰ͸ͳ͍ ൒ਫ਼౓ුಈখ਺఺਺
  60. texturesmuros_e.dds texturesmuros_a.dds texturesmuros_d.dds texturesmuros_g.dds texturesmuros_h.dds texturesmuros_p_.dds texturesBarro_2.dds texturesmuros_q.dds ... texturesFL15stm.dds

    texturesfuente_azulejo.dds texturesFL12pis1.dds san_miguel.bin san_miguel.gltf 43,782KB(35%) 44,423KB(125%) ௖఺഑ྻ ࠲ඪ ๏ઢ ઀ઢ ςΫενϟ࠲ඪ 110,572KB ςΫενϟ 284,641KB 2,700KB ϊʔυπϦʔͱ ϚςϦΞϧ ΠϯσοΫε 41,592KB(33%) 0KB(0%) 41,475KB(49%) etc. 171,369KB(32%) ߹ܭ