ã¿ãªããããã«ã¡ã¯ïŒ ç§ã®ååã¯Sergey Makeevã§ããã²ãŒã ã¹ã¿ãžãªMail.Ru Groupã®Allods TeamããŒã ã®Skyforgeãããžã§ã¯ãã®ãã¯ãã«ã«ãã£ã¬ã¯ã¿ãŒã§ãã Skyforgeã§ã°ã©ãã£ãã¯ãäœæããããã«äœ¿çšããã¬ã³ããªã³ã°ãã¯ãããžãŒã«ã€ããŠã話ãããããšæããŸãã ããã°ã©ããŒã®èŠ³ç¹ããSkyforgeãéçºããéã«çŽé¢ããã¿ã¹ã¯ã«ã€ããŠå°ãã話ãããŸãã ç¬èªã®ãšã³ãžã³ããããŸãã æè¡ã®éçºã¯é«äŸ¡ã§å°é£ã§ãããå®éã«ã¯ãã²ãŒã ãå§ãŸã£ãæç¹ïŒ3幎åïŒã§ããã¹ãŠã®ããŒãºãæºããããšãã§ããæè¡ã¯ãããŸããã§ããã ãŸãããšã³ãžã³ããŒãããäœæããå¿ èŠããããŸããã
ã²ãŒã ã®ã¡ã€ã³ã¢ãŒãã¹ã¿ã€ã«ã¯ããã¡ã³ã¿ãžãŒãšSFã®æ··åã§ãã ã¢ãŒããã£ã¬ã¯ã¿ãŒãšã¢ãŒãã£ã¹ãã®ã¢ã€ãã¢ãå®çŸããã«ã¯ãéåžžã«åŒ·åã§åŒ·åãªãããªã¢ã«ã·ã¹ãã ãäœæããå¿ èŠããããŸããã ãã¬ã€ã€ãŒã¯éæ³ãæè¡ãèªç¶çŸè±¡ã®çŸããèŠãããšãã§ãããã¹ãŠãç»é¢äžã«ãã£ãšããããæãããã®ææã·ã¹ãã ãå¿ èŠã§ãã ã°ã©ãã£ãã¯ã¹ã¿ã€ã«ã®ãã1ã€ã®ãæ±ãã¯ãå®ååãããçŸå®ãäœæããããšã§ãã ã€ãŸãããªããžã§ã¯ãã¯èªèå¯èœã§ããããªã¢ã«ã«èŠããŸãããããã¯äººçã®ãã©ããªã¢ãªãºã ã§ã¯ãããŸããã ç§ã®æèŠã§ã¯ãè¯ãäŸã¯æ ç»ã®ã¢ãã¿ãŒã§ãã çŸå®ã§ãããçŸå®ã¯èžè¡çã«è£ 食ãããŠãããçŸå®ã§ãããšåæã«ããšã話ã§ãã ã°ã©ãã£ãã¯ã¹ã¿ã€ã«ã®æ¬¡ã®æ±ã§ããç §æãšçŽ æã¯ãå¯èœãªéãèªç¶ã«èŠããŸãã ãããŠãããã°ã©ããŒã®èŠ³ç¹ãããèªç¶ã-ããã¯ãç©ççã«ããæå³ããŸãã
ããã°ã©ããŒã«ãšã£ãŠéèŠãªãã€ã³ãã¯ã巚倧ãªãªãŒãã³ã¹ããŒã¹ãå¿ èŠã ãšããããšã§ãã ãã®ã²ãŒã ã«ã¯ãå°ããªã€ã³ã¹ã¿ã³ã¹ã®å Žæãšãå€ãã®ãã¬ã€ã€ãŒãããåºå€§ãªé åã®äž¡æ¹ããããŸãã ãã®ãããªã§ã¯ãç§ãã¡ãçŸæç¹ã§éæããããšãèŠãããšãã§ããŸãã ãããªã«è¡šç€ºããããã¹ãŠã®ãã®ã¯ãã²ãŒã ãæ倧èšå®ã§äœ¿çšããŠã¬ã³ããªã³ã°ãããŸã
次ã«ããã®ãããªåçãã©ã®ããã«å®çŸãããã«ã€ããŠã話ããŸãã
ç©çããŒã¹ã®ã·ã§ãŒãã£ã³ã°ïŒç©çããŒã¹ã®ã·ã§ãŒãã£ã³ã°ïŒ
ç©çããŒã¹ã®ã·ã§ãŒãã£ã³ã°ã䜿çšããçç±
- ããã«ããããããªã¢ã«ã§çž®å°ãããç»åãåŸãããŸãã ããŸããŸãªã¢ãŒãã£ã¹ããäœæãã3Dã¢ãã«ã¯ãããŸããŸãªçš®é¡ã®ç §æã§å šäœçã«èŠããŸãã åçã®ãã©ããã¯å°ãªããç §æã¢ãŒãã£ã¹ãã¯ãã¹ãŠã®ç §æãªãã·ã§ã³ããã¹ãŠã®3Dã¢ãã«ãšçµã¿åãããå¿ èŠã¯ãããŸããã
- ãããªã¢ã«ã¯ã©ã€ããšã¯å¥ã«èšå®ã§ããŸãã ã€ãŸãããããªã¢ã«ã¢ãŒãã£ã¹ããšã©ã€ãã£ã³ã°ã¢ãŒãã£ã¹ãã¯äžŠè¡ããŠäœæ¥ã§ããŸãã äºæ³éããã©ããªå ã®èŠãç®ã§ãæ£ãã調æŽãããç©çãããªã¢ã«ã¯ã以åã¯éç©çãããªã¢ã«ã§ãããã£ãããã«çªç¶é»ããªããé²åºãªãŒããŒã«ãªããŸããã
- ææãã©ã¡ãŒã¿ã¯å°ãããªãããããã¯ãã¹ãŠç©ççãªæå³ãæã¡ãŸãã ã¢ãŒãã£ã¹ãã¯ãããã®ãã©ã¡ãŒã¿ãŒãç°¡åã«æäœã§ããŸãã ãã¡ãããæåã¯ååŠç¿ããå¿ èŠããããŸããããã®åŸãäœæ¥ã¯ã¯ããã«äºæž¬å¯èœã«ãªããŸãã
- çŽ æã®ã·ã¹ãã ã«ããããšãã«ã®ãŒä¿åã®æ³åã®é å®ã¯ãäžçäžã®èžè¡å®¶ãåããããããšãæå³ããŸãã å ã調æŽããå Žåãç»åãéšåã«ãæ£ä¹±ããããããšã¯ã§ããŸããã
- ã¡ãªã¿ã«ãç©ççãªæ£ç¢ºãã¯ç§ãã¡ã«ãã©ããªã¢ãªãºã ã匷ãããã®ã§ã¯ãããŸããã ããšãã°ãPixarãšDisney Studiosã«ãã£ãŠäœæãããææ°ã®æŒ«ç»ã¯ãã¹ãŠãç©ççãªã¬ã³ããªã³ã°ã䜿çšããŠäœæãããŸãã ããããåæã«ãã©ããªã¢ãªãºã ã¯ãããŸããããããªãèªèã§ããæ§åŒããããŸãã
ããã»ã¹ç©çåŠ
äœããããã°ã©ãã³ã°ããåã«ããŸãããã»ã¹ã®ç©çãç解ããå¿ èŠããããŸãã å ãè¡šé¢ã§è·³ãè¿ããšã©ããªããŸããïŒ å®ç掻ã§ã¯ãã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ã¹ãšã¯ç°ãªããè¡šé¢ã¯æ»ããã§ã¯ãããŸããããå®éã«ã¯å€ãã®å°ããªå¹åžã§æ§æãããŠããŸãã ãããã®äžèŠåæ§ã¯éåžžã«å°ãããããç®ã«ã¯èŠããŸããã ãã ãããããã¯è¡šé¢ããåå°ãããå ã«åœ±é¿ãäžããã®ã«ååãªå€§ããã§ãã ãã®åçã§ã¯ããã€ã¯ããµãŒãã§ã¹ãšåŒãã§ããŸãã
ãããå®éã®äŸã§ãã åçã«åã£ãŠããã®ã¯ãé»åé¡åŸ®é¡äžã®A4çšçŽã§ãã çŽã®ã·ãŒãã¯ãå®éã«ã¯å€ãã®ç¹ãåãããããæšè³ªç¹ç¶ã§æ§æãããŠããŸãããç®ã§ã¯ããããåºå¥ããŠããŸããã
ã¹ã±ãŒã«ã«ã€ããŠã¯ãç°ãªãã¹ãã¯ãã«ã®ç §æã®ââæ³¢é·ãããã¡ãŒãã«åäœã§æšå®ããçŽã®ã¹ãã£ã³ã§100,000ããã¡ãŒãã«ã®èŸºãæã€æ£æ¹åœ¢ã匷調衚瀺ããŸããã æããã«ããããã®ç¹ç¶ã¯èŠããŸããããå ã®åå°ã«åœ±é¿ããŸãã
æ ç»ã®ãªãã©ã€ã³ã¬ã³ããªã³ã°ã§ããããã®ãããªè©³çŽ°ã¬ãã«ã®ç §æãèšç®ããäœè£ã¯ãããŸããã ããã¯èšå€§ãªéã®ã³ã³ãã¥ãŒãã£ã³ã°ã§ãã
ã ãããè¡šé¢ã®åŸ®å°åœ¢ç¶ã å ã®äžéšã¯ãææå éšã§ã©ã³ãã ã«åå°ããåŸãééãŸãã¯åæŸå°ãããããåžåãããŸã-ç±ã«å€ãããŸãã å ¥å°å ã®äžéšã¯è¡šé¢ããåå°ãããŸãã ç°ãªãææãå ãåå°ããæ¹æ³ã«ã¯éãããããŸãã åäœãç°ãªã2ã€ã®ã°ã«ãŒãã¯ãèªé»äœãšå°äœïŒéå±ïŒã§ãã å ã¯éå±å éšã«æµžéããŸããããã»ãšãã©ãã¹ãŠãè¡šé¢ããåå°ãããŸãã å ã¯äž»ã«èªé»äœããåæŸå°ãããå°éã®å ãåå°ãããŸã-çŽ5ïŒ ã
çè«ã¯åªããŠããŸãããã³ã³ãã¥ãŒã¿ãŒã²ãŒã ãäœæããå ç·ã§ã¯ãªãç»é¢äžã®ãã¯ã»ã«ã§åäœããŸãã ããã«ãåãã¯ã»ã«ã¯å€æ°ã®å ã®å åã§ãã ãããŠããã®å ã¯ãã¹ãŠåžåãåæŸå°ããŸãã¯åå°ã§ããŸãã ããã¯ãã·ã§ãŒããŒãéçºãããšãã«èšç®ããå¿ èŠããããã®ã§ãã
BRDF
ããã»ã¹ã®ç©çåŠã決å®ããŸãããæ°åŠçã¢ãã«ã«ç§»ããŸãããã åå°ãããå ã®å²åãšåæŸå°ãŸãã¯åžåãããå ã®å²åãå€å¥ã§ããäž»ãªæ©èœã¯ããã·ã¢èªã§ã¯BRDF ïŒåæ¹ååå°ååžé¢æ°ïŒãŸãã¯DFOS ïŒ2ããŒã åå°é¢æ°ïŒãšåŒã°ããŸãã ãã®é¢æ°ã®ç®çã¯ãç¹å®ã®å ¥å°æŸå°ç·ã«å¯ŸããŠèŠ³æž¬è ã«åããŠæŸå°ããããšãã«ã®ãŒéãèšç®ããããšã§ãã çè«çã«ã¯ãããã¯å€æ¬¡å é¢æ°ã§ãããå€æ°ã®3Dã4Dã6Dãã©ã¡ãŒã¿ãŒã«äŸåããå ŽåããããŸãã
å®éã«ã¯ã2ã€ã®ãã©ã¡ãŒã¿ãŒFïŒlãvïŒã®é¢æ°ãèããŸããããã§ã lã¯è¡šé¢ç¹ããå æºãžã®æ¹åã vã¯èŠç·ã®æ¹åã§ãã
åšå²å çšã®BRDFïŒæ¡æ£ïŒ
åæŸå°ãããã©ã€ãã¢ãã«ã«ã€ããŠã¯ãããã€ãã®ä»®å®ãè¡ããŸãã
- ããŒã ã®å ¥å£ãšåºå£ãç¡èŠã§ããŸãããªããªã ãã®å Žåããã®å€ã¯éåžžã«éèŠã§ã¯ãããŸããã
- åæŸå°ãããå ç·ã¯ãã¹ãŠåçå ã«åäžã«ååžããŠãããšèããããŸãã
ææå éšã®å åã®æ¯ãèãã¯éåžžã«è€éã§ãããã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ã¹ã®çŸåšã®éçºã§ã¯ãããã¯éåžžã®è¿äŒŒã§ãããããã«å®éã®ç©çç枬å®å€ã«é©åã«å¯Ÿå¿ããŠããŸãã
åæŸå°ïŒæ£ä¹±ïŒå ãèšç®ããããã«ã次ã®é¢æ°ãååŸããŸãã
lã¯å æºã®æ¹åã vã¯ãã¥ãŒã®æ¹åã§ãããã®åçŽåãããã¢ãã«ã§ã¯äœ¿çšãããŸããã ãã¹ãŠã®ãšãã«ã®ãŒã¯åçã§åäžã«åæŸå°ãããŸãã
albedoïŒrgbïŒ -è¡šé¢ãåžåãããšãã«ã®ãŒéãšåæŸåºéã決å®ããŸãã ãããã£ãŠãããšãã°ãå®å šã«é»ãã¢ã«ãããå«ãè¡šé¢ã¯ããã¹ãŠã®ãšãã«ã®ãŒãåžåããŸãïŒç±ã«å€æããŸãïŒã å®éã PIã«ããé€ç®ãé€ãããã¹ãŠã®ã°ã©ãã£ãã¯ããã°ã©ããŒã«ã¯dotïŒnãlïŒãç¥ãããŠããŸãã çãšãæ³ãéµå®ããã«ã¯ ã PIã«ããåå²ãå¿ èŠã§ãã ãªããªã å ã¯åçã§æ£ä¹±ãããããnãlã«çããå Žåãåçã®ãã¹ãŠã®æ¹åã®åŒ·åºŠãå€æŽããã«å ¥å°å ãåå°ããŸãããããã¯ç©ççã«äžå¯èœã§ãã ãã ããéåžžãã·ã§ãŒããŒã«æž¡ãããå æºã®åŒ·åºŠã¯ãã§ã«PIã«ããé€ç®ãèæ ®ããŠããããã ãããïŒnãlïŒã®ã¿ãã·ã§ãŒããŒã«æ®ããŸãã
ãã¯ãã«ã®ã¹ã«ã©ãŒç©ïŒãããïŒã¯ããããã®ãã¯ãã«éã®äœåŒŠã§ããããšãããã£ãŠããŸãã åé¡ã¯ãå ã®å ¥å°è§ãåæŸå°ãããå ã®éã«ã©ã®ããã«åœ±é¿ãããã§ãã çãã¯ç°¡åã§ããæ圱é¢ç©ã¯ãè¡šé¢äžã®ããŒã ã®å ¥å°è§ã«äŸåããå ¥å°è§ã®äœåŒŠã«çãããªããŸãã ãããã£ãŠãå ¥å°è§ãéãã»ã©ãè¡šé¢ã«å°éãããšãã«ã®ãŒãå°ãªããªããŸãã
å ãéè§ã§èœã¡ã
å ãéè§ã«èœã¡ãæ圱é¢ç©ã倧ãããªããŸãã
åå°å çšã®BRDFïŒé¡é¢åå°ïŒ
åå°å ã®ã¢ãã«ã«ç®ãåããŸãã å ¥å°è§ãåå°è§ã«çããããšã¯èª°ããç¥ã£ãŠããŸãããäžã®åçã«ã¯å€ãã®åå°å ç·ããããŸãã ããã¯è¡šé¢ã®äžèŠåæ§ã«ãããã®ã§ãã ãããã®äžèŠåæ§ã«ãããåã ã®å åã¯ãããã«ç°ãªãæ¹åã«åå°ãããŸãã è¡šé¢ãååã«æ»ãããªå Žåãã»ãšãã©ã®å ç·ã¯äžæ¹åã«åå°ãããé¡ã®ãããªãªããžã§ã¯ãã®æ確ãªåå°ãèŠãããŸãã
è¡šé¢ãç²ãå Žåãéåžžã«å€ãã®å ç·ãç°ãªãæ¹åã«åå°ãããéåžžã«ããããªåå°ãèŠãããŸãã éåžžã«äžåäžãªè¡šé¢ã®å Žåãåå°å ã¯åçå éšã«åçã«ååžããå€éšã®èŠ³æž¬è ã«ã¯æ£ä¹±å ã®ããã«èŠããŸãã
ãã€ã¯ããã¡ã»ããçè«
ãã€ã¯ããã¡ã»ããçè«ã¯ãè¡šé¢ã®ãã€ã¯ããžãªã¡ããªãèæ ®ããŠãè¡šé¢ããã®å ã®åå°ã®å¹æãã·ãã¥ã¬ãŒãããããã«éçºãããŸããã ããã¯ãç°ãªãæ¹åã«åããããå€æ°ã®ãã€ã¯ããã¡ã»ããã®åœ¢ã§è¡šé¢ãè¡šãæ°åŠã¢ãã«ã§ããããã«ãåãã€ã¯ããã¡ã»ããã¯çæ³çãªé¡ã§ãããåãåçŽãªæ³åã«åŸã£ãŠå ãåå°ããŸããå ¥å°è§ã¯åå°è§ã«çããã§ãã
ããç¹ã§ã®ç §æãèšç®ããã«ã¯ãåãã€ã¯ããã¡ã»ããã®åå°å ã®å¯äžã®åèšãèšç®ããå¿ èŠããããŸãã ã€ãŸã ç©åãå¿ èŠã§ãã ããæç¹ã§å€ãã®ãã€ã¯ããã§ãŒã¹ããããæ°å€ã ããåã蟌ãã§çµ±åããããšã¯ã§ããŸããã åæ圢åŒã§ç©åã®è§£ãèŠã€ããŸãïŒãããïŒã ããã¯ãåå°å ãèšç®ããããã®é¢æ°ãäžè¬çãªåœ¢ã§ã©ã®ããã«èŠãããã§ãã
ããã¯ãã¯ãã¯ã»ãã¬ã³ãºã®åå°å æ©èœã§ãã
l-å ã®æ¹å
v-芳å¯è ã®èŠç·ã®æ¹å
nã¯è¡šé¢ã®æ³ç·ã§ã
hã¯ããã¯ãã«lãšvã®éã®ãã¯ãã«ïŒååã®ãã¯ãã«ïŒã§ãã
D ïŒhïŒ-埮å°é¢ã®ååžé¢æ°
F ïŒvãhïŒ-ãã¬ãã«é¢æ°
G ïŒlãvãhïŒã¯ããã€ã¯ããã§ãŒã¹ã®ã·ã§ãŒãã£ã³ã°ã®é¢æ°ã§ãã
ãã®é¢æ°ã®ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒã¯éåžžã«åçŽã§ãç©ççãªæå³ããããŸãã ããããããŒããã¯ãã«ã«ã¯ã©ã®ãããªç©ççæèŠããããŸããïŒ èŠ³æž¬è ã®å ã®åå°ã«å¯äžãããã€ã¯ããã§ãŒã¹ããã£ã«ã¿ãªã³ã°ããã«ã¯ãããŒããã¯ãã«ãå¿ èŠã§ãã ãã€ã¯ããã§ãŒã¹ã®æ³ç·ãããŒããã¯ãã«ã®å Žåããã®ãã€ã¯ããã§ãŒã¹ã¯ãã¥ãŒVã®æ¹åã®ç §æã«å¯äžããŸãã
BRDFã®ã¡ã³ããŒã詳ããèŠãŠã¿ãŸãããã
埮å°é¢ã®ååžé¢æ°DïŒhïŒ
ãã€ã¯ããã¡ã»ããããåå°ãããå ã®ååžã®é¢æ°ãšããŠãã³ãµã€ã³æ¬¡æ°ã䜿çšãããšãã«ã®ãŒä¿åã®æ³åã«åŸãæ£èŠåãè¡ããŸãã ãŸãã0..1ã®ç¯å²ã«ããè¡šé¢ç²ãä¿æ°ãååŸãããããã0.25ãã65536ã®ç¯å²ã«ããã¢ã«ãã¡ã®åºŠåããèšç®ããŸãã次ã«ã Nãã¯ãã«ãšHãã¯ãã«ã®ã¹ã«ã©ãŒç©ãååŸããã¢ã«ãã¡åºŠã«äžããŸãã çµæããšãã«ã®ãŒä¿åã®æ³åã«éåããªãããã«ãæ£èŠåå®æ°NDFã䜿çšããŸãã
æ£èŠåããªããšãè¡šé¢ããããå€ãã®ãšãã«ã®ãŒãåå°ãããŸãã ãããã£ãŠãå ãåå°ãããããªã¥ãŒã ãšããã®ããªã¥ãŒã ã®ãšãã«ã®ãŒååžãæå®ããŸãã ãããŠããã®ããªã¥ãŒã ã¯ãè¡šé¢ã®æ»ããããŸãã¯ç²ãã«äŸåããŸãã 次ã«ãBRDFã®æ¬¡ã®ã¡ã³ããŒãæ€èšããŸãã
ãã¬ãã«é¢æ°FïŒvãhïŒ
å ã®åå°ã®åŒ·ãã¯ãå ¥å°è§ã«äŸåããŸãã ãã®åäœã¯ããã¬ãã«ã®åŒã§èª¬æãããŠããŸãã ãã¬ãã«å ¬åŒã¯ã2ã€ã®åªäœã®å¢çãééãããšãã®åå°ããã³å±æããé»ç£æ³¢ã®æ¯å¹ ãšåŒ·åºŠã決å®ããŸãã ãã®å¹æã¯æ°Žäžã§éåžžã«é¡èã§ããéè§ã§æ°ŽãèŠããšãæ°Žã¯ã»ãšãã©ã®å ãåå°ããåå°ãèŠãããŸãã æ°Žãäžããäžã«èŠããšãå®éã«ã¯åå°ã¯èŠãããŸããããäžã«ãããã®ãèŠããŸãã
ããã«ãããšãã°ãããŸããŸãªææã®å ¥å°è§ã«å¿ããåå°å ã®ã°ã©ãããããŸãã ãŠã§ããµã€ãhttp://refractiveindex.info/ãã衚圢åŒã®ããŒã¿ãååŸããŸãã
ãã®ã°ã©ãã¯ããã©ã¹ããã¯ãã»ãšãã©ãã¹ãŠã®å ãæ£ä¹±ãããããå ¥å°è§ã60ã70床ã«éãããŸã§åå°ããªãããšã瀺ããŠããŸãã ãã®åŸãåå°å ã®éãæ¥æ¿ã«å¢å ããŸãã ã»ãšãã©ã®èªé»äœã§ã¯ãã°ã©ãã¯åæ§ã«ãªããŸãã
éå±ã®ç¶æ³ã¯ãã£ãšèå³æ·±ãã§ãã éå±ã¯ããããè§åºŠã§å€ãã®å ãåå°ããŸãããåå°å ã®éã¯æ³¢é·ã«ãã£ãŠç°ãªããŸãã ç¹ç·ã°ã©ãã¯ãé ã®å åå°ã瀺ããŠããŸãã æ³¢é·ã¯èµ€ãç·ãéã«å¯Ÿå¿ããŠããŸãã ã芧ã®ãšãããé ã¯ããå€ãã®èµ€ãåå°ãããããéå±ã¯è¡šé¢ã®è²ã§åå°å ãå¡ããŸãã ãããŠãèªé»äœã¯å ãçè²ããã«åå°ããŸãã
ãã¬ãã«ãèšç®ããé¢æ°ãšããŠãSchlickè¿äŒŒã䜿çšããŸãã ãã¬ãã«ã®å ã®æ¹çšåŒã¯ããªã¢ã«ã¿ã€ã ã®èšç®ã«ã¯éãããŸãã
ã芧ã®ãšããã Hããã³Vãã¯ãã«ã¯ã·ã¥ãªãã¯é¢æ°ã§äœ¿çšãããå ¥å°è§ã決å®ããã F0ãææã®ã¿ã€ããå®éã«èšå®ããŸãã F0ä¿æ°ã¯ãã¢ããªã³ã°ããææã®å±æçïŒIORïŒãç¥ãããšã§èšç®ã§ããŸãã å®éãã€ã³ã¿ãŒãããäžã®ãã£ã¬ã¯ããªã«ãããŸãã ãªããªã 空æ°1ã®IORãç¥ã£ãŠãããææã®è¡šIORãç¥ã£ãŠã次ã®åŒã§F0ãèšç®ããŸã
F0ã®ç©ççãªæå³ã¯æ¬¡ã®ãšããã§ã-çŽè§ã«åå°ããå ã®å²åã§ãã ãã¬ãã«ã¯ãå ¥å°è§ã«å¿ããŠãåžåãããå ã®éãšåå°ãããéãèšå®ããŸãã
F0ã¯ã·ã¥ãªãã¯è¿äŒŒã§äœ¿çšãããè¡šé¢ã«å¯ŸããŠçŽè§ã«åå°ãããå ã®éãèšå®ããŸãã èªé»äœã®F0ã®éåžžã®å€ã¯2ïŒ -5ïŒ ã§ãã èªé»äœã¯ã»ãšãã©åå°ãããå€ãæ£ä¹±ããŸãã
éå±ã¯ã»ãŒãã¹ãŠã®å ãåå°ããŸãããæ³¢é·ã«ãã£ãŠãã®éã¯ç°ãªããŸãã éå±ã®åå°ã¯ãè¡šé¢ã®è²ã§ãã€ã³ããããŸãã 次ã«ãBRDFã®æ¬¡ã®ã¡ã³ããŒãæ€èšããŸãã
ãã€ã¯ããã§ãŒã¹GïŒlãvãhïŒãã·ã§ãŒãã£ã³ã°ããæ©èœ
å®éãããŒããã¯ãã«ã«æ³ç·ã察å¿ãããã¹ãŠã®ãã€ã¯ããã¡ã»ãããç §æã«å¯äžããããã§ã¯ãããŸããã ãã€ã¯ããã§ãŒã¹ã§åå°ããããŒã ã¯ã芳枬è ã«å±ããªãå ŽåããããŸãã
åå°ããŒã ã¯ãè¡šé¢ã®åŸ®å°åœ¢ç¶ã«ãã£ãŠå¹²æžãããå ŽåããããŸãã åå°å ç·ã®äžéšã芳枬è ã«å±ããªãããšãããããŸãã ãããã£ãŠããã¹ãŠã®ãã€ã¯ããã§ãŒã¹ãå ã®åå°ã«é¢äžãããšã¯éããŸããã æãåçŽãªå¯èŠæ§é¢æ°ã䜿çšããŸãã å®éããã¹ãŠã®ãã€ã¯ããã§ãŒã¹ã¯å ãåå°ãããšä¿¡ããŠããŸãã ããã¯ãåœç€Ÿã®åå°å ååžæ©èœã§èš±å®¹ãããŸãã
ãã€ã¯ããµãŒãã§ã¹ãé«ããããïŒåžïŒã§äžããããŠãããšæ³åãããšããµãŒãã§ã¹ãçŽè§ã«èŠãŠããµãŒãã§ã¹ãçŽè§ã«ç §ãããŠããã©ã€ãã£ã³ã°ã«é¢ä¿ããªããã€ã¯ããã§ãŒã¹ã¯ãããŸããã è¡šé¢ã¯åžé¢ã§ãã ããã«ãé¢æ°ã¯å€§ããªè§åºŠã§ãŒãã«ãªãåŸåããããŸããããã¯ãé«ããããã®åœ¢åŒã§ã®åŸ®å°åœ¢ç¶ã®è¡šçŸãšãäžèŽããŠããŸãã ãªããªã è§åºŠãéãã»ã©ãå ãåå°ãããã€ã¯ããã¡ã»ããã¯å°ãªããªããŸãã
ããã¯ãåå°å ãèšç®ããããã®æçµé¢æ°ã§ãã
ããã¯ããã€ã¯ããµãŒãã§ã¹ãé«ãããããšããŠè¡šçŸããæ£èŠåãããBlin-Fongã¢ãã«ã«å¯Ÿå¿ããŸãã 以äžã¯ãææãã©ã¡ãŒã¿ãç²ããIORãææã®å€èŠ³ã«ã©ã®ããã«åœ±é¿ãããã®ãµã³ãã«åçã§ãã
çãšãã«ã®ãŒ
çãšãã«ã€ããŠç¹°ãè¿ãè¿°ã¹ãŠããŸããã ãšãã«ã®ãŒã®ç¯çŽãšã¯ãåçŽãªããšã§ããåå°å ãšæ£ä¹±å ã®åèšã¯ã1以äžã§ãªããã°ãªããŸããã ãã®ããšãããã¢ãŒãã£ã¹ãã«ãšã£ãŠéèŠãªç¹æ§ãç¶ããŸããåå°å ã®ãŸã¶ããã®æãããšåœ¢/é¢ç©ã¯ã€ãªãã£ãŠããŸãã ãã®ãããªæ¥ç¶ã¯ã以åã¯éç©ççãªã¬ã³ããªã³ã°ã§ã¯ãããŸããã§ããã ããã§ã¯ããšãã«ã®ãŒä¿åã®æ³åã«éåããå¯èœæ§ããããŸãã ããšãã°ãäžé£ã®ç»åã å æºã¯ãã¹ãŠã®åçã§åãã§ãããè¡šé¢ã®ç²ãã®ã¿ãå€æŽããŸãã
ãã¬ã¢ãå°ããªé åã«åæ£ãããã»ã©ãæãããªãããšãããããŸãã
å æºåŒ·åºŠ
ç§ãã¡ã®ã¢ãã«ã¯ç©çåŠã«åºã¥ããŠãããå æºã®ãšãã«ã®ãŒã®æ£çŽãªæžè¡°ã䜿çšããããšãéèŠã§ãã å ã®åŒ·åºŠã¯ãå æºãŸã§ã®è·é¢ã®2ä¹ã«åæ¯äŸããããšãããã£ãŠããŸãã ãã®åäœã¯ã次ã®åŒã§èª¬æã§ããŸãã
ãã®æ©èœã¯ããšãã«ã®ãŒã®æžè¡°æ¹æ³ã説æããã®ã«é©ããŠããŸãããããã€ãã®æ¬ ç¹ããããŸãã
- çŸå®ã®ç掻ã«ã¯ããèªäœã®ãµã€ãºãæããªãå æºã¯ååšããªãããã空éå ã®ãã€ã³ãããã§ã¯ãªããããªã¥ãŒã ããã®ãšãã«ã®ãŒã®æžè¡°ãèæ ®ããããšèããŠããŸãã
- ãã®é¢æ°ã§èšè¿°ãããæŸå°åŒ·åºŠã¯ãŒãã«ãªãåŸåããããŸããã決ããŠå°éããŸããã ããããç¹å®ã®è·é¢ã§åŒ·åºŠããŒãã«ãªãããã«ããŸãã ããã¯ã³ã³ãã¥ãŒãã£ã³ã°ãªãœãŒã¹ã®åçŽãªæé©åã§ãããæçµçµæã«åœ±é¿ãäžããªããã®ãèšç®ããå¿ èŠã¯ãããŸããã
æ°ããæžè¡°é¢æ°ã«ã¯ã2ã€ã®æ°ãããã©ã¡ãŒã¿ãŒãå¿ èŠã§ãã
R innerã¯å æºã®ãµã€ãºã§ãã
R outerã¯ãç §æã«å¯Ÿããå æºã®å¯äžããã¯ãéèŠã§ã¯ãªããªãè·é¢ã§ãã
æžè¡°æ©èœïŒ
次ã®ããããã£ããããŸãã
- R innerå ã®å®æ°ã
- ããè·é¢ã§ã¯ã R outerã¯0ã§ãã
- æžè¡°ã®äºæ¬¡æ³åã«å¯Ÿå¿ããŸãã
- ã·ã§ãŒããŒã§èšç®ããã«ã¯ååã«å®ãã§ãã
// float GetAttenuation(float distance, float lightInnerR, float invLightOuterR) { float d = max(distance, lightInnerR); return saturate(1.0 - pow(d * invLightOuterR, 4.0)) / (d * d + 1.0); }
以äžã¯2ã€ã®ã°ã©ãã®æ¯èŒã§ãã äºæ¬¡æžè¡°ãšç§ãã¡ã®ãã®ã ã»ãšãã©ã®é¢æ°ãäºæ¬¡é¢æ°ãšäžèŽããããšãããããŸãã
ææã¢ãã«
ããã»ã¹ã®ç©çåŠãšæ°åŠãæ±ã£ãã ããã§ã¯ãã¢ãŒãã£ã¹ããäœã«åœ±é¿ãããã決ããŸãããã ã©ã®ãã©ã¡ãŒã¿ãŒãæ§æããŸããïŒ ç§ãã¡ã®ã¢ãŒãã£ã¹ãã¯ããã¯ã¹ãã£ãéããŠãããªã¢ã«ã®ãã©ã¡ãŒã¿ãèšå®ããŸãã ããããäœæãããã¯ã¹ãã£ã¯æ¬¡ã®ãšããã§ãã
èªé»äœçš | éå±çš | |
---|---|---|
ããŒã¹ã«ã©ãŒ | ã¢ã«ãããèšå®ããŸã | ãã¯ãã«éšåF0ãå®çŸ©ããŸã |
æ®é | è¡šé¢ã«åçŽïŒãã¯ãã¬ãã«ïŒ | è¡šé¢ã«åçŽïŒãã¯ãã¬ãã«ïŒ |
ç²ãïŒå æ²¢ïŒ | è¡šé¢ç²ãïŒãã€ã¯ãã¬ãã«ïŒ | è¡šé¢ç²ãïŒãã€ã¯ãã¬ãã«ïŒ |
ãã¬ãã«f0 | èªé»äœã®ææã¿ã€ãïŒIORïŒã¯ã»ãšãã©åžžã«äžå®ã§ã | éå±ã®å Žåãã¹ã«ã©ãŒéšåF0 |
ã¡ã¿ã« | åžžã«0 | åžžã«1 |
ãã®ãããªæ©æ¢°çãªãã¬ãµã¹ã®è¡šé¢ç¹æ§ã®äŸã次ã«ç€ºããŸãã
ã¢ã«ãã
æ®éã®
è¶
FOïŒIORïŒ
ã¡ã¿ã«
äœæ¥ãç°¡çŽ åããããã«ãç§ãã¡ã®ã¢ãŒãã£ã¹ãã¯ããªã倧ããªçŽ æã®ã©ã€ãã©ãªãç·šéããŸããã 以äžã«äŸã瀺ããŸãã
é 延ã·ã§ãŒãã£ã³ã°
Skyforgeãéçºãããšããé 延ã·ã§ãŒãã£ã³ã°ã¢ãã«ã䜿çšããŸãã ããã¯çŸåšåºã䜿çšãããŠããæ¹æ³ã§ãã ã¡ãœããã¯é 延ãšåŒã°ããŸã ã¡ã€ã³ã¬ã³ããªã³ã°ãã¹ã§ã¯ãæçµã·ã§ãŒãã£ã³ã°ã®èšç®ã«å¿ èŠãªãã©ã¡ãŒã¿ãŒãå«ããããã¡ãŒã®ã¿ãå¡ãã€ã¶ãããŸãã ãã®ãããªãã©ã¡ãŒã¿ãããã¡ã¯ããžãªã¡ããªãããã¡ã®ç¥ã§ããG-BufferãšåŒã°ããŸãã
é 延ã·ã§ãŒãã£ã³ã°ã®é·æãšçæãç°¡åã«èª¬æããŸãã
é·æïŒ
- ãžãªã¡ããªã·ã§ãŒããŒãšã©ã€ãã£ã³ã°ã·ã§ãŒããŒã¯åé¢ãããŠããŸãã
- å€æ°ã®å æºãç°¡åã«äœæã§ããŸãã
- ã·ã§ãŒããŒã§ã®çµã¿åããã®ççºã¯ãããŸããã
çæïŒ
- 垯åå¹ ããå€ãã®ã¡ã¢ãªåž¯åå¹ ãå¿ èŠ è¡šé¢ãã©ã¡ãŒã¿ã®ãããã¡ã¯éåžžã«åãã§ãã
- 圱ã®ããå æºã¯ãŸã é«äŸ¡ã§ãã 圱ã®ãªãå æºã®äœ¿çšã¯ããªãéãããŠããŸãã
- ããŸããŸãªBRDFã®åã蟌ã¿ã®é£ããã ç°ãªãè¡šé¢ã«å¯ŸããŠç°ãªãç §æã¢ãã«ãäœæããããšã¯å°é£ã§ãã ããšãã°ã髪ãç°æ¹æ§éå±çšã®BRDFã
- éææ§ ããã¯å®éã«ã¯ãµããŒããããŠããŸãããã¡ã€ã³ç»åãæç»ããŠç §æããåŸã«éæ床ãæç»ããå¿ èŠããããŸãã
ãã®æè¡ã®äž»ãªæ¬ ç¹ã¯ã倧ããªã¡ã¢ãªåž¯åå¹ ãå¿ èŠãªããšã§ãã å¯èœãªéãç §æã«å¿ èŠãªè¡šé¢ãã©ã¡ãŒã¿ãŒãããã¯ããããšããŸãã ãã®çµæã深床ã«ã€ããŠã®æ å ±ãèæ ®ããªãå Žåããã¯ã»ã«ããã128ããã-96ã«é©åãã圢åŒã«ãªããŸããã
è¡šé¢ç¹æ§ã®ä¿åæ¹æ³ïŒ128ããã/ãã¯ã»ã«ïŒã
Skyforge Gãããã¡ãŒ
ãã³ããšã³ã
äœçœ®ã®åæ§ç¯
é 延ã·ã§ãŒãã£ã³ã°ã䜿çšããå ŽåãããŸããŸãªç©ºéã§ãã¯ã»ã«ã®äœçœ®ãåæ§ç¯ããå¿ èŠãçããããšããããããŸãã ããšãã°ãã¯ãŒã«ã空éããã¥ãŒç©ºéãã·ã£ããŠç©ºéãªã©ã GBufferã§ã¯ãããŒããŠã§ã¢æ·±åºŠãããã¡ãŒã䜿çšããŠãã¯ã»ã«æ·±åºŠã®ã¿ãä¿åããŸãã åé¡ã解決ã§ããå¿ èŠããããŸãã空éå ã®ãã¯ã»ã«ã®äœçœ®ãè¿ éã«ååŸããæ¹æ³ã§ããããŒããŠã§ã¢ã®æ·±ãã®ã¿ãæã¡ãç·åœ¢ã§ã¯ãªãåæ²ç·ååžãæã¡ãŸãã ã¢ã«ãŽãªãºã ã¯ããã®å€æã2段éã§è¡ããŸãã
ç·åœ¢æ·±åºŠã«å€æ
GbufferãåããåŸãåæ²ç·ååžã®æ·±åºŠãããã¡ãŒãç·åœ¢ã«å€æããŸãã ãããè¡ãã«ã¯ãæ·±ããããŸã£ããã«ããããã«ã¹ã¯ãªãŒã³ã®æé ã䜿çšããŸãã å€æã¯ã次ã®ã·ã§ãŒããŒã䜿çšããŠè¡ãããŸãã
// float ConvertHyperbolicDepthToLinear(float hyperbolicDepth) { return ((zNear / (zNear-zFar)) * zFar) / (hyperbolicDepth - (zFar / (zFar-zNear))); }
ç·åœ¢æ·±åºŠãR32F圢åŒã§ä¿åããã¬ã³ããªã³ã°ã®ãã¹ãŠã®æ®µéã§ç·åœ¢æ·±åºŠã®ã¿ã䜿çšããŸãã 2çªç®ã®æ®µéã¯ãç·åœ¢æ·±åºŠã䜿çšããäœçœ®ã®åæ§ç¯ã§ãã
ç·åœ¢æ·±åºŠã䜿çšããŠäœçœ®ãåæ§ç¯ãã
äœçœ®ããã°ããåæ§ç¯ããããã«ãåæ§ã®äžè§åœ¢ã®æ¬¡ã®ããããã£ã䜿çšããŸãã å¢çç·ãšé·ãïŒãŸãã¯äºçåç·ããŸãã¯äžå€®å€ããŸãã¯é«ãããŸãã¯äžå€®åçŽç·ïŒã®æ¯çã¯ãé¡äŒŒåºŠä¿æ°ã«çãããªããŸãã ãã®ãããªäžè§åœ¢ã§ã¯ã察å¿ããç·ïŒé«ããäžå€®å€ãäºçåç·ïŒã¯æ¯äŸããŠããŸãã äžè§åœ¢ïŒP1ãP2ãP3ïŒãšäžè§åœ¢ïŒP1ãP4ãP5ïŒã®2ã€ã®äžè§åœ¢ãèããŸãã
äžè§åœ¢ïŒP1ãP2ãP3ïŒã¯äžè§åœ¢ïŒP1ãP4ãP5ïŒã«äŒŒãŠããŸãã
ãããã£ãŠãè·é¢ïŒP1-P4ïŒïŒç·åœ¢æ·±åºŠïŒãšæ蟺ïŒP1ãP3ïŒãç¥ã£ãŠãäžè§åœ¢ã®é¡äŒŒæ§ã䜿çšããŠãã«ã¡ã©ãããã¯ã»ã«ãŸã§ã®è·é¢ïŒP1ãP5ïŒãèšç®ã§ããŸãã ãŸããã«ã¡ã©ãŸã§ã®è·é¢ãã«ã¡ã©ã®äœçœ®ãããã³èŠç·ã®æ¹åããããã°ãã«ã¡ã©ã®ç©ºéå ã®äœçœ®ãç°¡åã«èšç®ã§ããŸãã ã«ã¡ã©èªäœã¯ãã¯ãŒã«ãã¹ããŒã¹ããã¥ãŒã¹ããŒã¹ãã·ã£ããŠã¹ããŒã¹ãªã©ãä»»æã®ã¹ããŒã¹ã«èšå®ã§ããŸããããã«ãããå¿ èŠãªã¹ããŒã¹ã§åæ§ç¯ãããäœçœ®ãåŸãããŸãã
ãããã£ãŠãåã³ãã¢ã«ãŽãªãºã ã®ã¹ãããïŒ
- åæ²ç·ã®æ·±ããç·åœ¢ã«å€æããŸãã
- é ç¹ã·ã§ãŒããŒã§ãäžè§åœ¢ïŒP1ãP2ãP3ïŒãèšç®ããŸãã
- è£éåšãä»ããŠãã»ã°ã¡ã³ãïŒP1ãP3ïŒããã¯ã»ã«ã·ã§ãŒããŒã«æž¡ããŸãã
- è£éããããã¯ãã«RayDirïŒP1ãP3ïŒãååŸããŸãã
- ç¹å®ã®ãã€ã³ãã§ç·åœ¢ã®æ·±ããèªã¿åããŸãã
- äœçœ®= CameraPosition + RayDir * LinearDepthã
ã¢ã«ãŽãªãºã ã¯éåžžã«é«éã§ãã1ã€ã®è£éåšã1ã€ã®ALU MADåœä»€ã1ã€ã®æ·±åºŠèªã¿åãã§ãã 䟿å©ãªå皮空éã§äœçœ®ãåæ§ç¯ã§ããŸãã èšäºã®æåŸã«ããåæ§ç¯ã®ããã®HLSLã³ãŒãã
é深床ãããã¡ãŒ
SkyforgeãéçºãããšããçŽ40 kmã®éåžžã«å€§ããªå¯èŠç¯å²ã§äœçœ®ãæç»ã§ããããã«ãããšããã¿ã¹ã¯ããããŸããã ã¬ã³ããªã³ã°è·é¢ã瀺ãåçã次ã«ç€ºããŸãã
ãã¡ãŒãã¬ãŒã³ã®å€§ããªå€ã§ã®Zãã¡ã€ãã£ã³ã°ãåé¿ããããã«ãé深床ãããã¡ãŒãã¯ããã¯ã䜿çšããŸãã ãã®ææ³ã®æå³ã¯éåžžã«åçŽã§ããæ圱è¡åãèšç®ãããšããé æ¹é¢ãšè¿æ¹é¢ã亀æããæ·±ãæ¯èŒé¢æ°ã以äžïŒD3DCMP_GREATEREQUALïŒã ãéã«ããå¿ èŠããããŸãã ãã®ããªãã¯ã¯ãæ圱è¡åã§FarPlaneãšNearPlaneã亀æããå Žåã«ã®ã¿æ©èœããŸãã ãã¥ãŒããŒãã®ãã©ã¡ãŒã¿ãŒãå ¥ãæ¿ããããã·ã§ãŒããŒã®æ·±ããåºããããããšããã®ããªãã¯ã¯æ©èœããŸããã
ããããªãèµ·ããã®ãããããŠèšç®ã®æ£ç¢ºæ§ã®ã©ãã§åã€ã®ãã説æããŸãã 粟床ã倱ãããå Žæãç解ããããã«ãå°åœ±è¡åãã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã
ãããã£ãŠãæšæºã®å°åœ±è¡åã§ãã ç°è²ã§åŒ·èª¿è¡šç€ºãããŠãããããªãã¯ã¹ã®éšåã«èå³ããããŸãã Zããã³Wäœçœ®ã³ã³ããŒãã³ãã æ·±ãã¯ã©ã®ããã«èšç®ãããŸããïŒ
// float4 postProjectivePosition = mul( float4(pos, 1.0), mtxProjection ); // float depth = postProjectivePosition.z / postProjectivePosition.w;
äœçœ®ã«æ圱è¡åãæããåŸãæ圱åŸã®ç©ºéã®äœçœ®ãååŸããŸãã Wã«ããé è¿æ³ã®åå²ã®åŸãã¯ãªããã¹ããŒã¹å ã®äœçœ®ãååŸããŸãããã®ã¹ããŒã¹ã¯åäžã®ç«æ¹äœã«ãã£ãŠå®çŸ©ãããŸãã ãããã£ãŠã次ã®å€æãåŸãããŸãã
ããšãã°ãZnearãšZfarã®è·é¢ã¯éåžžã«å€§ãããçŽ50 kmã§ãããšããŸãã
Znear = 0.5
Zfar = 50000.0
次ã®2ã€ã®æ圱è¡åãååŸããŸãã
æšæºæ圱è¡å
æ¡åŒµãããæ圱ãããªãã¯ã¹
æšæºæ圱è¡åãæããåŸã®æ·±ãã¯ã次ã®å€ã«ãªããŸãã
ãããã£ãŠãå±éãããæ圱è¡åãä¹ç®ããåŸïŒ
ã芧ã®ããã«ãæšæºã®å°åœ±è¡åã®å Žåã深床ãèšç®ãããšãã«ãéåžžã«ç°ãªã次æ°-æ°äžãš0.5ã®æ°ãè¿œå ãããŸãã ç°ãªã次æ°ã®æ°åãè¿œå ããã«ã¯ãFPUã¯æåã«ææ°ãåäžã®å€ïŒãã倧ããªææ°ïŒã«ãã次ã«å ç®ã«ãã£ãŠåŸãããã«ãããªãè¿œå ããŠæ£èŠåããå¿ èŠããããŸãã å®éã倧ããªzå€ã§ã¯ãããã¯åã«ã«ãããªã®äžäœãããã«ãã¯ã€ããã€ãºãè¿œå ããŸãã æ¡åŒµãããæ圱è¡åã䜿çšããå Žåããã®ãããªåäœã¯ã«ã¡ã©ã®è¿ãã§ã®ã¿çºçããŸãããã®å Žåãæ·±ãã®åæ²ç·ååžã«ããããã§ã«é床ã®ç²ŸåºŠããããŸãã z = 20 kmã®ãšãã«äœãèµ·ãããã®äŸã次ã«ç€ºããŸãã
ãããŠãæ¡åŒµãããå°åœ±è¡åã®å ŽåïŒ
åèšïŒ
- æšæºã®24ãããD24深床ãããã¡ãŒã¯ãZãã¡ã€ãã£ã³ã°ãªãã§50 kmã®ç¯å²ãç°¡åã«ã«ããŒããŸãã
- é深床ã¯ã©ã®ãšã³ãžã³ã«ãé©ããŠããŸãããã¹ãŠã®ãããžã§ã¯ãã§äœ¿çšããããšããå§ãããŸãã
- 次ã®ããã«ãéçºã®éå§ãããµããŒããæäŸããããšãæåã§ãã ããçŽããªããã°ãªããªãå€ãã®å ŽæããããŸãïŒæ圱ãããªãã¯ã¹ããéå°é¢ãæœåºããã圱ããã®ãã€ã¢ã¹ãªã©ã
- ãããŒã深床ãããã¡ãã¿ãŒã²ãããã©ãããã©ãŒã ã§äœ¿çšå¯èœãªå Žåã¯ãããã䜿çšããããšããå§ãããŸãã ããã«ããã粟床ãããã«åäžããŸãã å€ã¯ããæ£ç¢ºã«ä¿åãããŸãã
ã芧ããã ãããããšãããããŸãïŒ
æåŠ
ããã£ã»ãããã³ã ã²ãŒã éçºã®ããã®ç©ççã«åæ©ä»ããããã·ã§ãŒãã£ã³ã°ã¢ãã«ã®äœæ
äºåç°åæŽã æ ç»ããã³ã²ãŒã å¶äœã«ãããç©çããŒã¹ã®ã·ã§ãŒãã£ã³ã°ã¢ãã«-ãã©ã€ãšãŒã¹ã§ã®å®çšçãªå®è£
ãšããŒã«ã»ããŒãœã³ åºå€§ãªã²ãŒã ã¯ãŒã«ãã®äœæ
Nickolay KasyanãNicolas SchulzãTiago Sousaã CryENGINE 3ã°ã©ãã£ãã¯ã¹ãã¯ãããžãŒã®ç§å¯
ãšãªãã¯ã»ãã€ãã ãã¹ãã³ã°ã·ã£ããŠã€ã³ã°æ©èœã«ã€ããŠ
ãã©ã€ã¢ã³ã»ã«ãªã¹ã ã¢ã³ãªã¢ã«ãšã³ãžã³4ã®ãªã¢ã«ã·ã§ãŒãã£ã³ã°
HLSLåæ§ç¯ã³ãŒãïŒé ç¹ã·ã§ãŒããŒïŒ
// float tanHalfVerticalFov; // invProjection.11; float tanHalfHorizontalFov; // invProjection.00; // float3 camBasisUp; float3 camBasisSide; float3 camBasisFront; // postProjectiveSpacePosition homogeneous projection space float3 CreateRay(float4 postProjectiveSpacePosition) { float3 leftRight = camBasisSide * -postProjectiveSpacePosition.x * tanHalfHorizontalFov; float3 upDown = camBasisUp * postProjectiveSpacePosition.y * tanHalfVerticalFov; float3 forward = camBasisFront; return (forward + leftRight + upDown); } void VertexShader(float4 inPos, out float4 outPos : POSITION, out float3 rayDir : TEXCOORD0) { outPos = inPos; rayDir = CreateRay(inPos); }
HLSLåæ§æã³ãŒãïŒãã¯ã»ã«ã·ã§ãŒããŒïŒ
// float3 camPosition; float4 PixelShader(float3 rayDir : TEXCOORD0) : COLOR0 { ... float linearDepth = tex2D(linearDepthSampler, uv).r; float3 position = camPosition + rayDir * linearDepth; ... } // float ConvertHyperbolicDepthToLinear(float hyperbolicDepth) { return ((zNear / (zNear-zFar)) * zFar) / (hyperbolicDepth - (zFar / (zFar-zNear))); }
å ã®ã¬ããŒãã®ã¹ã©ã€ã
www.slideshare.net/makeevsergey/skyforge-rendering-techkri14finalv21