ãã®èšäºã§ã¯ãäžéšã®ã²ãŒã ãä»ã®è£œåã§äœ¿çšãããã°ããŒãã«ïŒåå°ïŒç
§æãèšç®ããã¢ã«ãŽãªãºã ã®1ã€ã§ããVoxel Cone TracingïŒVCTïŒã®å®è£
ã«ã€ããŠèª¬æããŸãã ããããã誰ãã2011幎ã®å€ã
èšäº ïŒ[VCT]ïŒãèªãã ãã
ãããªãèŠãã®ã§ãããã ãããããã®èšäºã§ã¯ãã¢ã«ãŽãªãºã ã®1ã€ãŸãã¯å¥ã®æ®µéãå®è£
ããæ¹æ³ã«ã€ããŠã®è³ªåã«å¯Ÿããå
æ¬çãªåçãæäŸããŠããŸããã

ã°ããŒãã«ã«ãã¬ããžãªãã§ã·ãŒã³ãã¬ã³ããªã³ã°ããVCTã䜿çšããŸãããŸã第äžã«ãç°å¢ãããïŒPMREM / IBLïŒã䜿çšããã°ããŒãã«ç
§æã®å®è£
ã¯ãVCTãããå®äŸ¡ã§ãããšèšã䟡å€ããããŸãã ããšãã°ãããUE4éçºè
ã®1人ã
ããããã£ã¹ã ïŒ1:34:05-1:37:50ïŒã§ãVCTã䜿çšããŠããç°å¢ãããã䜿çšããŠãã¢ãã¬ã³ããªã³ã°ãããšè©±ããŸããããç»åã¯ã»ãŒåãã§ããã ãã ãããã®ã¢ãããŒãã®æ çµã¿å
ã§ç ç©¶ãé²è¡äžã§ãã ããšãã°ãNvidiaã®ææ°ã®VXGIã¯åœŒã®ã¢ã€ãã¢ã«åºã¥ããŠããŸãã
äœæ¥äžãèšäºã®æåŸã«ããå€ãã®ãœãŒã¹ã«äŸåããŠããŸããã
ã¿ã¹ã¯ãç°¡çŽ åããããã«ãå®è£
ã§ã¯æ¡æ£ç
§æïŒLabmertã®ã¢ãã«ïŒã®ã¿ãèæ
®ãããŸããããã®ã¢ã«ãŽãªãºã ã¯ä»ã®å€ãã®BRDFã«é©ããŠãããšäž»åŒµãããŠããŸãã ãŸããå®è£
ã¯ã·ãŒã³ã®åçãªããžã§ã¯ããèæ
®ããŸããã
DirectXã®èгç¹ããå®è£
ã説æããŸããããã®ãããªã¢ã«ãŽãªãºã ã¯OpenGLã§ãå®è£
ã§ããŸãã äžéšã®DX 11.1ãããã¯äœæ¥ã§äœ¿çšãããŸããïŒããšãã°ãé ç¹ã·ã§ãŒããŒã§UAVã䜿çšïŒããããã䜿çšããã«å®è¡ã§ããããããã®ã¢ã«ãŽãªãºã ã®æå°ã·ã¹ãã èŠä»¶ãäœããªããŸãã
ã¢ã«ãŽãªãºã ã®åäœãããããçè§£ããããã«ããã®äžè¬çãªæ®µéã説æããæ¬¡ã«ãããã®ããããã«ã€ããŠè©³ãã説æããŸãã ã¢ã«ãŽãªãºã ã®æãäžè¬çãªéšåïŒ
- ã·ãŒã³ã®ãã¯ã»ã«å ã ãããªã¢ã«ããããã£ïŒè²ãªã©ïŒãšãµãŒãã§ã¹æ³ç·ãå«ããã¯ã»ã«ã®ã»ããã«ã·ãŒã³ãã©ã¹ã¿ã©ã€ãºããŸãã


- åå°ç
§æããŒã¹ã ã ãã¯ã»ã«ã®å Žåãå
æºããã®å
¥åãŸãã¯åºåæŸå°ãèšç®ãããçµæã3Dãã¯ã¹ãã£ã«èšé²ãããŸãã


- ãã¬ãŒã¹ã³ãŒã³ ã 衚é¢ã®èšç®ããããã¯ã»ã«ããšã«ãåéã®ã°ã«ãŒããäœæãããŸãã ã³ãŒã³ã¯ãããŸããŸãªã¿ã€ãã®3Dã©ã€ãã£ã³ã°ãã¯ã¹ãã£ããæŸå°ããã£ããã£ããããã«æŸåºãããã¬ã€ã®ã°ã«ãŒããæš¡å£ããæœè±¡åã§ãã æçµçµæã¯å éå¹³åãããã¡ã€ã³ç
§æãšå ç®ãããŸãã


ãããã®ã¹ããŒãžã«ã¯ãå®è£
ã®ããã®ã€ããªãã®ãŒãªãã·ã§ã³ãããã€ããããã远å ã®æé©åãå«ãŸããŸãã ãããã©ã®ããã«è¡ãããäžè¬çãªæ¹æ³ã§ç€ºããããšæããŸãã
ãŸãããã¯ã»ã«åãããã·ãŒã³ã®ã¹ãã¬ãŒãžæ§é ãæ±ºå®ããŸãããã ãã¹ãŠã®ãªããžã§ã¯ãã3Dãã¯ã¹ãã£ã«ãã¯ã»ã«åã§ããŸãã ãã®ãœãªã¥ãŒã·ã§ã³ã®æ¬ ç¹ã¯ãã»ãšãã©ã®ã·ãŒã³ã空ã®ã¹ããŒã¹ã§ãããããã¡ã¢ãªæ¶è²»ãæé©åãããªãããšã§ãã R8G8B8A8圢åŒã®è§£å床256x256x256ã®ãã¯ã»ã«åã§ã¯ããã®ãããªãã¯ã¹ãã£ã¯64 MBãå æããããã¯ããããèæ
®ããã«è¡ãããŸãã ãã®ãããªãã¯ã¹ãã£ã¯ãè²ãšè¡šé¢ã®æ³ç·ãããã³ãã€ã¯ãã©ã€ãã£ã³ã°ã«å¿
èŠã§ãã
ã¡ã¢ãªæ¶è²»ãæé©åããããã«ãããŒã¿ãããã³ã°ã¢ã«ãŽãªãºã ã䜿çšãããŸãã å®è£
ã§ã¯ãå
ã®èšäºãšåæ§ã«ãã¹ããŒã¹ãã¯ã»ã«ãªã¯ããªãŒïŒSVOïŒã䜿çšããŸãã ããããä»ã®ã¢ã«ãŽãªãºã ãããšãã°3D Clipmap [S4552]ããããŸãã
SVOã¯ãã·ãŒã³ã®ãŸã°ããªå
«åæšã§ãã ãã®ãããªããªãŒã®åããŒãã¯ãã·ãŒã³ã®éšå空éã8ã€ã®çããéšåã«åå²ããŸãã ã¹ããŒã¹ããªãŒã«ã¯ãäœãå æãããŠããªãã¹ããŒã¹ã«é¢ããæ
å ±ã¯ä¿åãããŸããã ãã®æ§é ã䜿çšããŠã空éå
ã®åº§æšã«ãã£ãŠãã¯ã»ã«ãæ€çŽ¢ãããã€ã¯åŠçãããç
§æããµã³ããªã³ã°ããŸãã ãã€ã¯åŠçãããç
§æã¯ãç¹å¥ãª3Dãã¯ã¹ãã£ïŒãããã¯ãããã¡ïŒã«ä¿åãããŸããããã«ã€ããŠã¯ã以äžã§èª¬æããŸãã
ã¢ã«ãŽãªãºã ã®å段éãåå¥ã«æ€èšããŸãã
ãã¯ã»ã«åã·ãŒã³

ãã¯ã»ã«åãããã·ãŒã³ããã¯ã»ã«ã®é
åãšããŠä¿åããŸãã GPUã§ã¯ããã®é
åã¯StructuredBuffer / RWStructuredBufferãéããŠå®è£
ãããŸãã ãã¯ã»ã«ã®æ§é ã¯æ¬¡ã®ãšããã§ãã
struct Voxel { uint position; uint color; uint normal; uint pad;
ã·ãŒã³ãã³ã³ãã¯ãã«ä¿åããã«ã¯ãSVOã䜿çšããŸãã ããªãŒã¯ãR32_UINT圢åŒã®2Dãã¯ã¹ãã£ã«ä¿åãããŸãã ããªãŒããŒãæ§é ïŒ
SVOããŒãã®æŠç¥å³[DP]æåŸã®ã¬ãã«ã§ã¯ãSVOãªãŒãã¯ãã®é
åãã察å¿ãããã¯ã»ã«ã®ã€ã³ããã¯ã¹ãä¿åããŸãã
ã·ãŒã³ã®è§£å床ã256x256x256ã§ãå®å
šã«å¡ãã€ã¶ãããããªãŒãä¿åããã«ã¯ããµã€ãº6185x6185ïŒ145.9 MbïŒã®ãã¯ã¹ãã£ãå¿
èŠã ãšããŸãããã ãã ããå®å
šãªããªãŒãä¿åããã€ããã¯ãããŸããã ç§ã®èгå¯ã«ãããšããã®ãããªã·ãŒã³ã®è§£å床ãæã€ã¹ãã³ã¶ã·ãŒã³ã®å Žåãã¹ããŒã¹ããªãŒã¯2080x2080ïŒ16.6 MbïŒã®ãã¯ã¹ãã£ã«é
眮ãããŸãã
ãã¯ã»ã«ã®é
åãäœæãã
ãã¯ã»ã«ã®é
åãäœæããã«ã¯ãã·ãŒã³å
ã®ãã¹ãŠã®ãªããžã§ã¯ãããã¯ã»ã«åããå¿
èŠããããŸãã é¢é£ãã
OctreeããŒã¹ã®ã¹ããŒã¹ãã¯ã»ã«åã®èšäºããã®åçŽãªãã¯ã»ã«åãæŽ»çšããŸãããã ãã®ææ³ã¯å®è£
ãç°¡åã§ã1ã€ã®GPUãã¹ã§æ©èœããŸãã
ãã€ãã©ã€ã³ãã¯ã»ã«åæ©èœ[SV]ã·ãŒã³ã®å¢çããã¯ã¹ãèšç®ããŸãã ãã¥ãŒããŒããèšå®ããŠããã¯ã»ã«åãããã·ãŒã³ã解決ããŸãïŒããšãã°ã256x256ïŒã å¢çãã¥ãŒãã«åãããã«ãæ£å°æåœ±ã«ã¡ã©ãã¹ããŒãžäžã«é
眮ããŸãã æ€èšããåã·ãŒã³ãªããžã§ã¯ããã¬ã³ããªã³ã°ããŸãã
ãžãªã¡ããªã·ã§ãŒããŒã§ã¯ããªããžã§ã¯ãã®äžè§åœ¢ãåŠçããŸãã äžè§åœ¢ã®æ³ç·ã䜿çšããŠããã®äžè§åœ¢ã®æåœ±é¢ç©ãæå€§ã«ãªãæ¹åã«è»žãéžæãããŸãã 軞ã«å¿ããŠãã©ã¹ã¿ã©ã€ã¶ãŒãžã®æåœ±ãæå€§ã®äžè§åœ¢ãå転ãããŸããããã«ããããã¯ã»ã«ãå¢ããŸãã
ãã¯ã»ã«ã·ã§ãŒããŒã§ã¯ãåãã©ã°ã¡ã³ãã¯ãã¯ã»ã«ã«ãªããŸãã 座æšãè²ãæ³ç·ã䜿çšããŠãã¯ã»ã«æ§é ãäœæãããã¯ã»ã«é
åã«è¿œå ããŸãã
ãã®æ®µéã§ã¯ããªããžã§ã¯ãã®äœããªLODïŒLODïŒã䜿çšããŠããã¯ã»ã«ã®æ¬ èœã飿¥ããäžè§åœ¢ã®ãã¯ã»ã«ã®ããŒãžã«åé¡ããªãããã«ããããšãæãŸããã§ãïŒãã®ãããªã±ãŒã¹ã¯[SV]ã§èª¬æããŸãïŒã


ãã¯ã»ã«åã¢ãŒãã£ãã¡ã¯ã-ãã¹ãŠã®äžè§åœ¢ãã©ã¹ã¿ã©ã€ãºãããããã§ã¯ãããŸããã äœããªãŽã³ããŒããŸãã¯ã¹ãã¬ãããã©ã€ã¢ã³ã°ã«ãããã«äœ¿çšããŸãããã¯ã»ã«ãªã¹ãã§ãªã¯ããªãŒãäœæãã
ã·ãŒã³å
šäœããã¯ã»ã«åããããšã座æšãæã€ãã¯ã»ã«ã®é
åãã§ããŸãã ãã®é
åãããSVOãæ§ç¯ã§ããŸããSVOã䜿çšããŠã空éã§ãã¯ã»ã«ãèŠã€ããããšãã§ããŸãã æåã«ãSVOã䜿çšãããã¯ã¹ãã£ã®åãã¯ã»ã«ã¯0xffffffffã«åæåãããŸãã ã·ã§ãŒããŒãä»ããŠããªãŒããŒããèšè¿°ããããã«ãSVOãã¯ã¹ãã£ã¯UAVãªãœãŒã¹ïŒRWTexture2DïŒãšããŠè¡šãããŸãã ããªãŒãæäœããã«ã¯ãã¢ãããã¯ããŒãã«ãŠã³ã¿ãŒïŒD3D11_BUFFER_UAV_FLAG_COUNTERïŒãéå§ããŸãã
octreeãäœæããã¢ã«ãŽãªãºã ãæ®µéçã«èª¬æããŸãã SVOã®ããŒãã¢ãã¬ã¹ã®äžã§ãããŒãã®ã€ã³ããã¯ã¹ãããã«æå³ãããã¯ã¹ãã£ã®2D座æšã«å€æãããŸãã ããã«ãããŒãã®å²ãåœãŠãšã¯ã次ã®äžé£ã®ã¢ã¯ã·ã§ã³ãæå³ããŸãã
- ããŒãã«ãŠã³ã¿ã®çŸåšã®å€ã䜿çšããŠãå²ãåœãŠãããããŒãã®åããŒããé
眮ãããã¢ãã¬ã¹ãèšç®ãããŸãã
- ããŒãã«ãŠã³ã¿ãŒã¯ãåããŒãã®æ°ã ãå¢å ããŸãïŒ8ïŒã
- åããŒãã®ã¢ãã¬ã¹ã¯ãçŸåšã®ããŒãã®ãã£ãŒã«ãã«èšé²ãããŸãã
- çŸåšã®ããŒãã®ãã©ã°ãã£ãŒã«ãã«ã¯ãå²ãåœãŠãããŠããããšãèšé²ãããŸãã
- çŸåšã®ããŒãã®ã¢ãã¬ã¹ã¯ãåããŒãã®èŠªãã£ãŒã«ãã«èšé²ãããŸãã
octreeã®æŠç¥å³ãšãã¯ã¹ãã£å
ã®ãã®è¡šçŸ[SV]é«ãNã®å
«åæšãäœæããã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã
- ã«ãŒãããŒããå²ãåœãŠãŸã ã çŸåšã®ããªãŒã¬ãã«=1ãããŒãã«ãŠã³ã¿ãŒ= 1ã
- ãã¯ã»ã«ãæŽçããŸãã ãã¯ã»ã«ããšã«ããããå±ããããªãŒã®çŸåšã®ã¬ãã«ã§ããŒãïŒãµãã¹ããŒã¹ïŒãèŠã€ããŸãã ãã®ãããªããŒãã«ã¯ãå²ãåœãŠãå¿
èŠã§ããããšã瀺ããã©ã°ãä»ããŸãã ãã®ã¹ãããã¯ããã¯ã»ã«æ°ãšSV_VertexID屿§ã®ã¿ã䜿çšããŠãã¯ã»ã«é
åãã¢ãã¬ã¹æå®ããããšã§ããããã¡ãŒãªãã®Input-Assemblerã䜿çšããŠé ç¹ã·ã§ãŒããŒã§äžŠååã§ããŸãã
- çŸåšã®ããªãŒã¬ãã«ã®ããŒãããšã«ããã©ã°ã確èªããŸã ã å¿
èŠã«å¿ããŠãããŒããå²ãåœãŠãŸãã ãã®ã¹ããŒãžã¯ãé ç¹ã·ã§ãŒããŒã§äžŠååããããšãã§ããŸãã
- çŸåšã®ããªãŒã¬ãã«ã®ããŒãããšã«ãåããŒãã«é£æ¥ããŒãã®ã¢ãã¬ã¹ãæžã蟌ã¿ãŸã ã
- çŸåšã®ããªãŒã¬ãã«ã¯++ã§ãã çŸåšã®ããªãŒã¬ãã«ã<Nã«ãªããŸã§ãæé 2ã5ãç¹°ãè¿ããŸãã
- æåŸã®ã¬ãã«ã§ã¯ãçŸåšã®ããŒããå²ãåœãŠã代ããã«ããã¯ã»ã«é
åã«ãã¯ã»ã«ã€ã³ããã¯ã¹ãæžã蟌ã¿ãŸã ã ãããã£ãŠãæåŸã®ã¬ãã«ã®ããŒãã«ã¯æå€§8ã€ã®ã€ã³ããã¯ã¹ãå«ãŸããŸãã
ãã®ãããªå
«åæšãæ§ç¯ãããšãSVOãäžã空éã®åº§æšã«ãã£ãŠã·ãŒã³ã®ãã¯ã»ã«ãç°¡åã«èŠã€ããããšãã§ããŸãã
octreeãããã¯ãããã¡ãŒã®äœæ
ãã¯ã»ã«åãããã·ãŒã³ã®å
«åæšãæ§ç¯ããã®ã§ããã®æ
å ±ã䜿çšããŠãå
æºããã®ãã¯ã»ã«ã«ãã£ãŠåå°ãããç
§æãä¿åã§ããŸãã ç
§æã¯ãR8G8B8A8圢åŒã®3Dãã¯ã¹ãã£ã§ä¿åãããŸãã ããã«ããããã¯ã¹ãã£ã®ãµã³ããªã³ã°æã«GPUã®ãã©ã€ãªãã¢è£éã䜿çšã§ããããã«ãªãããã®çµæãããæ»ãããªæçµç»åãåŸãããŸãã ãã®ãã¯ã¹ãã£ã¯ãSVOã«åŸã£ãŠé
眮ããããããã¯ã§æ§æãããŠãããããããªãã¯ãããã¡ãšåŒã°ããŸãã ãããã¯ã¯ã空éå
ã®ãã¯ã»ã«ã®ã°ã«ãŒãã®å¥ã®è¡šçŸã§ãã
SVOã®èã«ã€ã³ããã¯ã¹ãé
眮ãããŠãã2x2x2ãã¯ã»ã«ã®ã°ã«ãŒãã¯ã3Dãã¯ã¹ãã£ããã®3x3x3ãã¯ã»ã«ãããã¯ã«è¡šç€ºãããŸãã
ãã¯ã»ã«ã®ã°ã«ãŒãããã¯ã»ã«ã®ãããã¯ã«ãããã³ã°ãã[DP]ã·ãŒã³å
ã§é£ãåã£ãŠé
眮ããããã¯ã»ã«ã®ã°ã«ãŒãã¯ããã¯ã¹ãã£ã«æ£åšããããšããããŸãïŒãã¯ã¹ãã£ã¯SVOã«åºã¥ããŠããããïŒã ãããã£ãŠããã¯ã»ã«ã®é£æ¥ã°ã«ãŒãéã®æ£ããè£éã®ããã«ã飿¥ãããã¯éã®å€ãå¹³ååãã远å ã®äœæ¥ãè¡ãå¿
èŠããããŸãã
飿¥ãããã¯ã®å¢çã®å¹³ååãããã¯ããã®ãã¯ã»ã«ã¯ããã¯ã»ã«ã®æåã®ã°ã«ãŒãã®è§ãšãããã®éã«ãããŸãã ãããã£ãŠããããã¯ã¯ãå
ã®ãã¯ã»ã«ãããå€ãã®ã¹ããŒã¹ãå æããŸãã ãã ãããããã¯å
ã®ãµã³ããªã³ã°ã¯ãå
ã®ãã¯ã»ã«ã®å¢çã«æ²¿ã£ãŠå®è¡ãããŸãã ãã®ããããã¯ã»ã«ã®ååã®å¹
ã®åºåãæåã䌌ãŠããŸãããããã¯æ±ºããŠäœ¿çšãããŸããã
SVOãªãŒãã«åŸã£ãŠé
眮ããããããã¯ã¯ãå
ã®ãã¯ã»ã«ã®è¡šç€ºã§ãã octreeã®ç¹å®ã®ã¬ãã«ã«ããä»ã®SVOããŒãã«åŸã£ãŠé
眮ããããããã¯ã¯ããããã¯ãããã¡ãŒã®MIPã¬ãã«ã§ãã
octreeã®æŠç¥å³ããã¯ã¹ãã£å
ã®ãã®è¡šçŸããããã¯ãããã¡ãžã®ãããã³ã°[SV]ãã®å Žåããããã¯ã¯3x3x3ã§ããå¿
èŠã¯ãªãã2x2x2ãããã³5x5x5ã«ããããšãã§ããŸã-ããã¯è¡šç€ºã®ç²ŸåºŠã®åé¡ã§ãã 2x2x2ãããã¯ã¯ã¡ã¢ãªãç¯çŽãããã1ã€ã®è¯ãæ¹æ³ã§ããããã®ãããªã¢ãããŒããèŠãããšã¯ãããŸããã
4ã€ã®é£æ¥ãããã¯ã»ã«ããµã³ããªã³ã°ãããšãã®è£éã®æ¯èŒïŒãããã¯ãããã¡ãŒãªãã3x3x3ã®ãããã¯ãããã¡ãŒãããã³5x5x5ã®ãããã¯ã®ãããã¡ãŒãããã®ãããªãããã¯ãããã¡ã®äœæã¯ãããªãæéãããããŸãã ã·ãŒã³ã®éæåºŠãä¿åãããããšç
§æãä¿åããããã®2ã€ã®ãããã¡ãäœæããŸãã
ãããã¯ãããã¡ãŒãäœæããæé
æåã®ã¹ãããã¯ãoctreeã®èãšäžèŽãããããã¯ã®ãã¯ã»ã«ãå¡ãã€ã¶ãããšã§ãã ç¹å®ã®SVOãã¯ã»ã«ã§åå°å
ãèšç®ãããšããŸãã ãããã®å€ã¯ããããã¯ãããã¡ãŒã®å¯Ÿå¿ããè§åºŠãã¯ã»ã«ã«è¡šç€ºãããŸãã

çºä¿¡ç
§æã®èšç®ãå®äºãããããããã¯ããšã«æ®ãã®ãã¯ã»ã«ãšãããã¯å
ã®é£æ¥ãããã¯ã»ã«ã®å¹³åå€ã远å ããŸãã

次ã«ã飿¥ãããããã¯éã®å€ãå¹³åããŸãã ãã®ããã空éå
ã®é£æ¥ããŒãã¯ããªãŒã®ããŒãã«ä¿åãããŸãã
ãããã¯ãããã¡ãå¹³ååããããã®ãªãã·ã§ã³ã®1ã€ã¯ã3ã€ã®ãã¹ã§åè»žã«æ²¿ã£ããã®ã§ãã ãã®å¹³ååã§çºçããå¯èœæ§ã®ããã¢ãŒãã£ãã¡ã¯ãã¯ãèµ€ãé·æ¹åœ¢ã§ããŒã¯ãããŠããŸã[DP]ãã®ãããªãããã¡ã®MIPã¬ãã«ãäœæããŸãã SVOã®äžäœã¬ãã«ã®ããŒãã¯ãåºç€ãšãªãã¬ãã«ããã®å¹³åå€ãå«ããããã¯ã§è¡šç€ºãããŸãã ããªãŒã®æäžäœã®ããŒãã«å¯Ÿå¿ããåãããã¯ã«ã¯ã察å¿ããåå«ã®ãããã¯ããã®æ
å ±ãå«ãŸããŸãã ãŸããããªãŒå
ã®åããŒãã ãã§ãªãã飿¥ããŒãã«ãçŽæ¥å¯Ÿå¿ãããããã¯ã«ããããšãã§ããŸãïŒäžå³ãåç
§ïŒã
å·ŠåŽ-ãããã¯ã«ã¯ãåãããã¯ãšãã®é£æ¥ãããã¯ããã®æ
å ±ãå«ãŸããŸãã æ£ãã-ãããã¯ã«ã¯åãããã¯ããã®æ
å ±ã®ã¿ãå«ãŸããŸã[DP]ã¡ã¢ãªã¢ã¯ã»ã¹ã®åæ°ãæžããããã«ãèšç®ãããåãããã¯ã«åãããã¯ã®ãã¯ã»ã«ã®ã¿ã䜿çšãããŸãïŒå³å³ïŒã ãã®åŸãåè¿°ã®ããã«ã飿¥ãããããã¯éã®å€ãå¹³ååãããŸãã ãããŠãSVOã®ã«ãŒãããŒãã«å°éãããŸã§MIPã¬ãã«ãäœæããŸãã
2ã€ã®ãããã¡ãäœæããŠã¿ãŸããã-ã·ãŒã³ã®éæãããã¯ã®ãããã¡ãšåå°å
ãããã¯ã®ãããã¡ã
éæãããã¯ã®ãããã¡ã¯ãã·ãŒã³ã®ãã¯ã»ã«åããããžãªã¡ããªã«åºã¥ããŠäºåã«äœæãããŸãã æåæ§ãã¯ã»ã«ã®éæåºŠãç¶æããŸãã ãããè¡ãã«ã¯ããã¯ã»ã«ã®éæåºŠã«åŸã£ãŠãããã¯ã®ãã¯ã»ã«ã®RGBå€ãå
¥åããŸããèšç®ãããåãã¯ã»ã«ã®ãããã¯ã®MIPã¬ãã«ãäœæããå ŽåãXYZè»žã«æ²¿ã£ãå¹³åæå€§éæåºŠå€ãéžæãã察å¿ããRGBãã¯ã¹ãã£å€ã«ä¿åããŸãã ãã®ãœãªã¥ãŒã·ã§ã³ã¯ãç¹å®ã®æ¹åã®ç©ºéã§ã®å
ã®é®æãèæ
®ããã®ã«åœ¹ç«ã¡ãŸãã
åæ¹åã§ãéæåºŠã®å€ã®æå€§å€ãéžæãããŸãïŒã€ãŸãã1.0ã¯å®å
šã«äžéæãªãªããžã§ã¯ãã§ããããã®å€ã¯æå€§ã«ãªããŸãïŒã ããã«ãMIPã¬ãã«ãæ§ç¯ãããšãã«ãããŒã¿ãŒãããã¯ã®XYZè»žã«æ²¿ã£ãæå€§å€ãå¹³ååãããRGBã³ã³ããŒãã³ãã«è¿œå ãããŸãã [DP]åå°ããŒãã³ã°
ãã¯ã»ã«ã«ãã£ãŠåå°ãããç
§æã¯ãèšç®ãããå
æºããã·ã£ããŠããããåŠçããããšã«ãã£ãŠèšç®ãããŸãã ãã®ãããã䜿çšããŠã空éå
ã®ãªããžã§ã¯ãã®åº§æšãååŸããSVOã䜿çšããŠãç
§ãããããã¯ã»ã«ã®ã€ã³ããã¯ã¹ã«å€æã§ããŸãã
éåžžãã·ã£ããŠãããã®è§£å床ã¯ãoctreeã®è§£å床ãããé«ããªããŸãã å
ã®èšäºã§ã¯ãã·ã£ããŠãããã®åãã¯ã»ã«ãæ¡ä»¶ä»ãå
åãšèŠãªãããã¢ãããŒãã«ã€ããŠèª¬æããŠããŸãã ãããã£ãŠãå
åã®æ°ã«å¿ããŠãç
§æãžã®ç°ãªãå¯äžããããŸãã ç§ã®å®è£
ã§ã¯ããã®æ®µéãç°¡ç¥åããã·ã£ããŠãããã«èœã¡ããã¯ã»ã«ããšã«ç
§æã1åã ãã«ãŠã³ãããŸããã
ç¹°ãè¿ãèšç®ãåé¿ããããã«ãåå°ç
§æããã§ã«èšç®ãããŠããåãã¯ã»ã«ã«å¯ŸããŠããã¯ã»ã«ãžã®ãã€ã³ã¿ãæ ŒçŽãããªã¯ããªãŒããŒãã®ãã©ã°ãããã䜿çšããŸãã ãŸããã·ã£ããŠããããåŠçãããšããåããã¯ã»ã«ã«å«ãŸãããã¯ã»ã«ã®ãã¡ãèšç®ã®ããã«å·Šäžã®ãã¯ã»ã«ã®ã¿ãéžæã§ããŸãã

ã·ã£ããŠãããã®æçïŒå·ŠïŒã å³åŽ-åããã¯ã»ã«ã®äžéšã§ããå·Šäžã®ãã¯ã»ã«ãèµ€ã§è¡šç€ºãããŸããåå°ç
§æãèšç®ããã«ã¯ãæšæºã®ã¢ã«ãã* lightColor *ãããïŒnãlïŒã䜿çšãããŸãããäžè¬çãªå Žåã¯BRDFã«äŸåããŸãã èšç®ãããç
§æã¯ãç
§æãŠãããã®ãããã¡ã«èšé²ãããŸãã ã·ã£ããŠãããã®åŠçåŸããããã¯ãããã¡ãåå
å¡«ãããäžèšã®ããã«MIPã¬ãã«ãäœæãããŸãã
ã¢ã«ãŽãªãºã ã¯éåžžã«é«äŸ¡ã§ãã ç
§æã®å€æŽããšã«ç
§æãŠãããã®ãããã¡ãåèšç®ããå¿
èŠããããŸãã å¯èœãªæé©åæ¹æ³ã®1ã€ã¯ã
ãã¬ãŒã ã«ãããããã¡æŽæ°
ãå¡ãã€ã¶ãããšã§ãã
G-Bufferã®äœæ
ç¹å®ã®ãã¯ã»ã«ã®åéã«ãã¯ã»ã«ãã¬ãŒã¹ãé©çšããã«ã¯ã空éå
ã®ãã¯ã»ã«ã®æ³ç·ãšäœçœ®ãç¥ãå¿
èŠããããŸãã ãããã®å±æ§ã¯ãSVOããã€ãã¹ããŠç
§æãããã¯ãããã¡ãŒããµã³ããªã³ã°ããããã«äœ¿çšãããŸãã ãããã®å±æ§ã¯
G-bufferããååŸã§ããŸãã
Gãããã¡ã䜿çšãããšããã¥ãŒããŒããããäœãè§£å床ã§åå°å
ãèšç®ããããšãã§ããããã©ãŒãã³ã¹ãåäžããŸãã
åéã§ãã¯ã»ã«ããã¬ãŒã¹ãã
ç
§æãããã¯ã®ãããã¡ãèšç®ããããšãã·ãŒã³ãããã¬ãŒã å
ã®ãªããžã§ã¯ãã«åå°ãããç
§æãã€ãŸãã°ããŒãã«ç
§æã®èšç®ã«é²ãããšãã§ããŸãã ãããè¡ãã«ã¯ãåéã§ãã¯ã»ã«ããã¬ãŒã¹ããŸãã
åãã¯ã»ã«ã«å¯ŸããŠãBRDFã«åŸã£ãŠããã€ãã®ã³ãŒã³ãæŸåºãããŸãã Lambertã©ã€ãã£ã³ã°ã¢ãã«ã®å Žåãã³ãŒã³ã¯Gãããã¡ãŒããæŽŸçããæ³ç·ã䜿çšããŠæ¹åä»ããããåçã«åäžã«æŸå°ãããŸãã
å
¥å°å
ãèšç®ããã衚é¢ããåéãæŸå°ãã[VCT]èšç®ã§ã¯ããã¯ã»ã«ã®æ¹åã®è¡šé¢äžã®ç¹ããåŸãããç
§æã¯ãç¹å®ã®èŠçã®åéã®è¡šé¢ã«åãã£ãŠãã¯ã»ã«ããæŸå°ãããç
§æãšåãã«ãªããšä»®å®ããŸãã
[VCT]ãã¬ãŒã¹ã¯æ®µéçã«è¡ãããŸãã åã¹ãããã§ãç
§æãããã¯ã®ãããã¡ã¯ãæäœå€ããæé«å€ãŸã§ãoctreeããªãŒã®ã¬ãã«ïŒã€ãŸããäœæãããMIPã¬ãã«ïŒã«åŸã£ãŠãµã³ããªã³ã°ãããŸãã
SVO [DP]ã¬ãã«ã«åŸã£ãŠã³ãŒã³ã䜿çšããŠãããã¯ãããã¡ãŒããµã³ããªã³ã°ããã³ãŒã³ã䜿çšãããã¬ãŒã¹ã¯ãããªã¥ãŒã ãªããžã§ã¯ãã®ã¬ã³ããªã³ã°ã«äŒŒãŠããŸã[A]ã ã€ãŸã ã¢ã«ãã¡ããã³ãããŒããã¯ã¢ãã«ã䜿çšãããŸãããã®ã¢ãã«ã§ã¯ãã³ãŒã³ã«æ²¿ã£ã次ã®åã¹ãããã§ãè²ãšéæåºŠã次ã®ããã«èšç®ãããŸãã
' = ' + ( 1 â ' ) * ' = ' + ( 1 â ' ) *
ããã§ãaã¯éæåºŠãcã¯éæåºŠïŒäºåä¹ç®ãããã¢ã«ãã¡ïŒãââä¹ç®ããç
§æãããã¯ã®ãããã¡ãŒããååŸããå€ã§ãã
éæåºŠå€ã¯ãéæãããã¯ãããã¡ã䜿çšããŠèšç®ãããŸãã
opacityXYZ = opacityBrickBuffer.Sample( linearSampler, brickSamplePos ).rgb; alpha = dot( abs( normalize( coneDir ) * opacityXYZ ), 1.0f.xxx );
ã€ãŸããéæåºŠã¯ç¹å®ã®ãã€ã³ãã§åéã®æ¹åã«èªã¿åãããŸãã ãããå¯äžã®ã¢ãããŒãã§ã¯ãããŸããã ããšãã°ãã©ã€ãã£ã³ã°ãããã¯ãããã¡ã®ã¢ã«ãã¡ãã£ãã«ã«éæåºŠãä¿åã§ããŸãã ãã ããåå°å
ã®æ¹åã¯å€±ãããŸãã ãŸããç
§æãŠãããã®6ã€ã®ãããã¡ãŒïŒå軞ã«2ã€ïŒã«æåæ§ç
§æãä¿åããããšããŸãã-ç®ã«èŠããå©ç¹ãããã³ã¹ããããããŸãã
ã³ãŒã³ã®æçµçµæã¯ãã³ãŒã³ã®è§åºŠã«å¿ããŠéã¿ä»ããããŠèŠçŽãããŸãã ãã¹ãŠã®ã³ãŒã³ãåãå Žåãééã¯åçã«åå²ãããŸãã åéã®æ°ãšè§£ã®è§åºŠã®ãµã€ãºã®éžæã¯ãé床ãšåè³ªã®æ¯çã®åé¡ã§ãã ç§ã®å®è£
ã§ã¯ã60床ã®5ã€ã®ã³ãŒã³ïŒäžå€®ã«1ã€ãåŽé¢ã«4ã€ïŒã
äžã®å³ã¯ãåéã®è»žã«æ²¿ã£ããµã³ããªã³ã°ãã€ã³ããæš¡åŒçã«ç€ºããŠããŸãã ãµã³ãã«ã®å ŽæãéžæããŠã察å¿ããã¬ãã«ã®å
«åæšããŒããåéã«åãŸãããã«ããããšããå§ãããŸãã ãŸãã¯ã察å¿ããçäœ[SB]ã«çœ®ãæããããšãã§ããŸãã ãããããã®åŸãã·ã£ãŒããªãã¯ã»ã«å¢çã衚瀺ãããå Žåãããããããµã³ãã«ã®äœçœ®ã調æŽãããŸãã ç§ã®å®è£
ã§ã¯ããµã³ãã«ãäºãã«è¿ã¥ããã ãã§ãã
åå°å
ã«å¯ŸããããŒãã¹ãšããŠã
ã¢ã³ããšã³ããªã¯ã«ãŒãžã§ã³ã·ã§ãŒãã£ã³ã°ãååŸããŸããããã¯ããã¬ãŒã¹ããååŸããã¢ã«ãã¡å€ã«åºã¥ããŠèšç®ãããŸãã ãŸããåéã®è»žã«æ²¿ã£ãåã¹ãããã§AOãèšç®ããå Žåãè·é¢
1 / (1 + lambda * distance)
ã«å¿ããŠè£æ£ãè¡ãããŸããããã§ãã©ã ãã¯ãã£ãªãã¬ãŒã·ã§ã³ãã©ã¡ãŒã¿ã§ãã
çµæã¯ãRGBAãã¯ã¹ãã£ïŒç
§æçšã®RGBãšAOçšã®AïŒã«ä¿åãããŸãã ããæ»ãããªçµæãåŸãããã«ããã¯ã¹ãã£ã«ãŒãããé©çšã§ããŸãã æçµçµæã¯BRDFã«äŸåããŸãã ç§ã®å Žåãèšç®ãããåå°ã¯æåã«Gãããã¡ããååŸãã衚é¢ã¢ã«ããã§ä¹ç®ãããæ¬¡ã«ãªãã·ã§ã³ã§AOã§ä¹ç®ãããæåŸã«ã¡ã€ã³ã©ã€ãã£ã³ã°ã«è¿œå ãããŸãã
äžè¬ã«ãç¹å®ã®èª¿æŽãšæ¹åãè¡ã£ãåŸã®å³ã¯ãèšäºã®çµæã«äŒŒãŠããŸãã


çµæã®æ¯èŒ-å·ŠåŽã¯Mental Rayã§ã¬ã³ããªã³ã°ãããã·ãŒã³ãå³åŽã¯å
ã®èšäºã®ãã¯ã»ã«ã³ãŒã³ãã¬ãŒã¹ãäžå€®ã¯ç§ã®å®è£
ã§ããèœãšã穎
èªå·±çºå
ã®åé¡ ã ã»ãšãã©ã®å Žåã衚é¢ã¯ããèªäœã®ãã¯ã»ã«ã«ç©ççã«é
眮ãããŠãããããäœããã®æ¹æ³ã§èªå·±çºå
ã«å¯ŸåŠããå¿
èŠããããŸãã 1ã€ã®è§£æ±ºçã¯ãæ³ç·ã®æ¹åã«åéã®å§ãŸããæŒãããšã§ãã ãŸããç
§æã®æ¹åååžããã¯ã»ã«ã«ä¿åãããŠããå Žåããã®åé¡ã¯çè«çã«åé¿ã§ããŸãã
ããã©ãŒãã³ã¹ã®åé¡ ã ã¢ã«ãŽãªãºã ã¯éåžžã«è€éã§ãããGPUã«å¹æçã«å®è£
ããã«ã¯å€ãã®æéãããããŸãã ããªãæçœãªæé©åã䜿çšããŠãå®è£
ããæ£é¢ãããæžããŸããããè² è·ãé«ããªããŸããã åæã«ãããªãŒå
ã®ãã¯ã»ã«ãæ€çŽ¢ãããšãã«æé©åãããã¢ã«ãŽãªãºã ã§ããSVOãã¯ã¹ãã£ã®å€ãã®äŸåãµã³ãã«ãå¿
èŠã«ãªããŸãã
ç§ã®å®è£
ã§ã¯ã5ã€ã®ã³ãŒã³ãæŸåºãã256x256x256ã®4ã€ã®æåŸãã2çªç®ã®ãªã¯ãããªãŒã¬ãã«ã®ãããã¯ãããã¡ãŒããµã³ããªã³ã°ããŸãã Intel GPAã«ãããšãçžå¯Ÿçãªããã©ãŒãã³ã¹ååžã¯æ¬¡ã®ãšããã§ãã
ããã©ãŒãã³ã¹ååžã äºåã«å·åŽããããšãªãGãããã¡ãŒãšã·ã£ããŠããããå
ã®èšäºã§ã¯ãSVOå
šäœã§512x512ãã¯ã¹ãã£äžã«3ã€ã®æ¡æ£ã³ãŒã³ã䜿çšããŠããŸãïŒ512x512x512-9ã¬ãã«ïŒã çŽæ¥ç
§æãšçµã¿åããããšã512x512ã®ãã¬ãŒã æéã®çŽ45ïŒ
ãããããŸãã åªåããããšããããããããŸãã ãŸããã©ã€ãã£ã³ã°ãããã¡ã®æŽæ°ã®æé©åã«ã泚æãæãå¿
èŠããããŸãã
ã¢ã«ãŽãªãºã ã®å¥ã®åé¡ã¯ã
ãªããžã§ã¯ãããã®å
æŒãã§ã ã ããã¯ãéæãããã¯ãããã¡ã«ãããã«å¯äžãã现ããªããžã§ã¯ãã§çºçããŸãã ãŸããSVOã®äœã¬ãã«ã®ç
§ãããããã¯ã»ã«ã®è¿ãã«ããå¹³é¢ã¯ããã®çŸè±¡ã®åœ±é¿ãåããŸãã

å
æŒãïŒå·ŠåŽ-VCTã¢ã«ãŽãªãºã ã䜿çšããŠããå Žåãå³åŽ-å®éã«ã ãã®åœ±é¿ã¯AOã§è»œæžã§ããŸããäžèšãããå¥ã®çµæãç¶ããŸãïŒè¯ãåçãåŸãããã«ã¢ã«ãŽãªãºã ã調æŽããããšã¯ããã»ã©ç°¡åã§ã¯ãããŸãã-ããã€ã®ã³ãŒã³ãåãããSVOã¬ãã«ã®æ°ãã©ã®ä¿æ°ã§ããªã©ã
ã·ãŒã³å
ã®éçãªããžã§ã¯ãã®ã¿ã調ã¹ãŸããã åçãªããžã§ã¯ããä¿åããã«ã¯ãSVOãšå¯Ÿå¿ãããããã¡ãŒã倿Žããå¿
èŠããããŸãã ååãšããŠããã®å ŽåãéçããŒããšåçããŒããå¥ã
ã«æ ŒçŽããããšãææ¡ãããŠããŸãã
èŠçŽãããšãååãªæéãå¿èã匷ãããªããã°ããã®ææ³ã¯ãå§ãããŸããã ããããããã¯ãã£ãšããããã¢ã³ããšã³ãç
§æãéæããã®ã«åœ¹ç«ã¡ãŸãã
ãã€ããã¯ã¹ã®ãã¢ïŒ
ã¢ããªã±ãŒã·ã§ã³ãªã³ã¯ïŒ
https :
//github.com/Darkxiv/VoxelConeTracing ïŒbin / VCT.exeïŒ
ãã¯ã»ã«ã³ãŒã³ãã¬ãŒã¹ã®å®è£
ã«åœ¹ç«ã€ãœãŒã¹ãšãªãœãŒã¹ã®ãªã¹ãïŒ