ãã®ãã¥ãŒããªã¢ã«ã§ã¯ã
iridiscenceã«ã€ããŠ
説æããŸãã ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãè²ã®åå°ãäœæãããããªã¢ã«ã®åäœãçè§£ããåçŸããããã«ãå
ã®æ¬è³ªãæ¢ããŸãã ãã®ãã¥ãŒããªã¢ã«ã¯Unityã®ã²ãŒã éçºè
ã察象ãšããŠããŸããããã®ãã¥ãŒããªã¢ã«ã§èª¬æããææ³ã¯ãUnrealãWebGLãªã©ã®ä»ã®èšèªã§ç°¡åã«å®è£
ã§ããŸãã
ãã¥ãŒããªã¢ã«ã¯ã次ã®ããŒãã§æ§æãããŸãã
- ããŒã1.å
ã®æ§è³ª
- ããŒã2.è¹ã®æ¹å-1
- ããŒã3.è¹ã®æ¹å-2
- ããŒã4.åææ Œåãçè§£ãã
- ããŒã5.åææ Œåã®æ°åŠ
- ããŒã6. CD-ROMã·ã§ãŒããŒïŒåææ Œå-1
- ããŒã7.ã·ã§ãŒããŒCD-ROMïŒåææ Œå-2
ã¯ããã«
Iridiscenceã¯ãå
ã®è§åºŠãèŠéè§ãå€åãããšãªããžã§ã¯ãã®è²ãå€åããå
åŠçŸè±¡ã§ãã ãã®å¹æã®ãããã§ã泡ã«ã¯éåžžã«å¹
åºãè²ã®ãã¬ããããããŸãã
è¹è²ã¯ãæµåºããã¬ãœãªã³ã®ããŒã«ãCD-ROMã®è¡šé¢ãããã«ã¯æ°é®®ãªèã«ãçŸããŸãã å€ãã®æè«ãåç©ã¯ãè¹åœ©ã䜿çšããŠãé©åãªè²çŽ ãªãã§è±ãäœããŸãã
ããã¯ãããããã¹ãŠã®ãªããžã§ã¯ãã®è¡šé¢ã«ããå
ãšåŸ®çްæ§é ã®çžäºäœçšã«ããè¹åœ©ãçºçããããã§ãã æè«ã®å€éšéªšæ Œã®CD-ROMãã©ãã¯ãšãã¬ãŒã¯ïŒäžã®ç»åãåç
§ïŒã¯ãçžäºäœçšããå
ã®æ³¢é·ãšåçšåºŠã®å€§ãããæã£ãŠããŸãã å®éãè¹åœ©ã¯å
ã®çã®æ³¢åæ§ãæããã«ããæåã®çŸè±¡ã§ããã ç§ãã¡ã¯ãå
ãäœã§ããããã©ã®ããã«æ©èœãã人éã®ç®ã§ã©ã®ããã«ç¥èŠãããããæåã«çè§£ããããšãªããè¹åœ©ã説æãåçŸããããšã¯ã§ããŸããã
å
ã®æ§è³ª
å€ãã®äºååç²åãšåæ§ã«ãå
ã¯ç²åãšæ³¢ã®ç¹æ§ãåæã«ç€ºããŸãã å€ãã®å Žåãå
ã¯1çªç®ãŸãã¯2çªç®ãšããŠã¢ãã«åãããŸãã ã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãå
ã¯
å
åãšåŒã°ããæ°å
åã®åã
ã®ç²åã§æ§æãããŠãããšèããããšãã§ããŸãã ããšãã°ãã»ãšãã©ã®ã·ã§ãŒããŒã¯ããã©ãã³ãå°ããªããªã€ãŒãããŒã«ã®ããã«æ¯ãèããè¡çªããè§åºŠã§ââãªããžã§ã¯ãããåå°ããããšèããŠããŸãïŒäžå³ãåç
§ïŒã
ããããå
ã¯æ³¢ãšããŠãã¢ãã«åã§ããŸãã ç©çåŠè
ã¯ãã®æŠå¿µã«ç²ŸéããŠããŸãããéçºè
ã¯åžžã«ãããèªèããŠããããã§ã¯ãããŸããã ããã§ã¯ãå
ãæ³¢ã®åœ¢ã§ååšããããšã®æå³ãçè§£ããã®ã«æéããããŸãããã
ç§ãã¡ã¯çæµ·ã®æ³¢ãç¥ã£ãŠããŸãã æµ·é¢äžã®åãã€ã³ãã«ã¯é«ãããããŸãã å¹³åå€ãé«ãã»ã©ãæ³¢ã¯é«ããªããŸãã æ°Žé¢ãä¹±ããšãæ³¢ã¯ãšãã«ã®ãŒãæ¶æ£ãããŸã§æµ·ãäŒæãå§ããŸãã
å
ã¯æ³¢ã§ãããæ°Žé¢äžã®é«ããšããŠæž¬å®ããã®ã§ã¯ãªãã
é»ç£å Žãç®çã®ãã€ã³ãã§æã£ãŠãããšãã«ã®ãŒãšããŠå®çŸ©ãããŸãã ãã®ã¢ãã«ã«ãããšãå
ã¯ç©ºéãäŒæããé»ç£å Žã®æåã§ãã æ³¢ãäœãããåšå²ã®ç©ºéã«å€ãã®å
åãæŸåºããé»çãæ³åã§ããŸãã
å
åã«ãã£ãŠäŒéããã
ãšãã«ã®ãŒã®éã«ãã£ãŠãå
ã®è²ã決ãŸããŸãã äœãšãã«ã®ãŒã®å
åã¯èµ€ãšèªèãããŸãã é«ãšãã«ã®ãŒã®å
åã¯çŽ«è²ãšããŠèªèãããŸãã æ³¢ã«ã¯ãç²åãšãã«ã®ãŒã«äŒŒãç¹æ§ããããŸãïŒ
æ³¢é· ã çŽæçãªçè§£ã®ããã«ãããã¯æ³¢ã®2ã€ã®ããŒã¯éã®è·é¢ã§ãããšèšããŸãã
å
ã¯åžžã«åãéåºŠïŒæ¯ç§çŽ299,792,458ã¡ãŒãã«ïŒã§ç§»åããŸããã€ãŸããé»ç£æ³¢ã¯åãé床ã§äŒæããŸãã é床ã¯äžå®ã§ãããæ³¢é·ã¯ç°ãªãå ŽåããããŸãã é«ãšãã«ã®ãŒå
åã¯çæ³¢é·ã§ãã æçµçã«è²ã決å®ããã®ã¯å
ã®æ³¢é·ã§ãã
äžã®å³ã§ãããããã«ã人éã®ç®ã¯ãçŽ700ããã¡ãŒãã«ãã400ããã¡ãŒãã«ã®ç¯å²ã®æ³¢é·ã®å
åãç¥èŠã§ããŸãã ããã¡ãŒãã«ã¯ã¡ãŒãã«ã®10ååã®1ã§ãã
ããã¡ãŒãã«ã¯ã©ããããå°ããã§ããïŒèªç¶ãæ©èœããæå°ã®ã¹ã±ãŒã«ãææ¡ããããšãããšããè°è«ãããæ¬¡å
ãæ³åããããšã¯å°é£ã§ãã å¹³åçãªäººã®èº«é·ã¯çŽ1.6ã¡ãŒãã«ã§ãã 人éã®é«ªã®æ¯ã®å€ªãã¯çŽ50 ãã€ã¯ãã¡ãŒãã« ïŒ50ãã¯ãã³ïŒã§ãã ãã€ã¯ãã¡ãŒãã«ã¯ã100äžåã®1ã¡ãŒãã«ã§ãïŒ1ÎŒm= 0.000001ã¡ãŒãã«= ã¡ãŒã¿ãŒïŒã ããã¡ãŒãã«ã¯ãã€ã¯ãã¡ãŒãã«ã®1000åã®1ã§ãïŒ1 nm = 0.000000001ã¡ãŒãã«= ã¡ãŒã¿ãŒïŒã ã€ãŸããå¯èŠå
ã®æ³¢é·ã¯ã人éã®é«ªã®æ¯ã®çŽ100åã®1ã§ãã
次ã¯ïŒ
ãã¥ãŒããªã¢ã«ã®æ®ãã®éšåã§ãã®ç°¡åãªç޹ä»ãããåŸãiridiscenceãšãã®Unityã§ã®å®è£
ã®çè§£ã«çŠç¹ãåœãŠãŸãã
- è¹ã®æ¹åã åè¿°ã®ããã«ã人éã®ç®ã§ã¯ç°ãªãæ³¢é·ã®å
ãç°ãªãè²ãšããŠèªèãããŸãã æ¬¡ã®2ã€ã®ããŒãã§ã¯ããããã®æ³¢é·ãRGBã«ã©ãŒã«é¢é£ä»ããæ¹æ³ã説æããŸãã ãã®ã¹ãããã¯ãè¹è²ã®åå°ãé«ã粟床ã§åçŸããããã«å¿
èŠã§ãã ãããã®ããŒãã§ã¯ãç©ççã«æ£ç¢ºã§èšç®å¹çã®é«ãæ°ããã¢ãããŒãã玹ä»ããŸãã
- åææ Œåã ãã®ãã¥ãŒããªã¢ã«ã®ããŒã4ãš5ã§ã¯ã åææ ŒåãèŠãŠãããŸãã ããã¯ããããªã¢ã«ã«è¹è²ã®åå°ã衚瀺ããããšãã§ã¯ãã®1ã€ã®æè¡åã§ãã ãã®ãæè¡ãã«ããããããããã®å
åŠçŸè±¡ãæ¯é
ããæŽŸçæ¹çšåŒã¯éåžžã«åçŽã§ãã åææ Œåã®æ°åŠã«èå³ããªãå Žåã¯ãããŒã5ãã¹ãããã§ããŸãã
- ã·ã§ãŒããŒCD-ROMã ãã®ãã¥ãŒããªã¢ã«ã®äžå¿ã¯ãCD-ROMã·ã§ãŒããŒã®å®è£
ã§ãã åã®ããŒãã§åéããç¥èã䜿çšããŠãUnityã«åææ Œåãå®è£
ããŸãã Unity 5 Standard Surface Shaderã®æ¡åŒµã§ãã ããã«ããããã®å¹æã¯ç©ççã«æ£ç¢ºã§ãããåå®çã§ãã å°ãæéããããã ãã§ãåææ Œåã«åºã¥ããŠä»ã®çš®é¡ã®è¹è²ã®åå°ã«äžèŽããããã«å€æŽã§ããŸãã
ãŸãšãããš
ãã®ã»ã¯ã·ã§ã³ãããiridiscenceãã¥ãŒããªã¢ã«ãéå§ããŸããã ãã®èšäºã®æ®ãã®éšåã§ã¯ã泡ããCD-ROMãæµåºããã¬ãœãªã³ããæè«ã«è³ããŸã§ãããŸããŸãªçŽ æã§ã®ç¡åœ©ãªåå°ãã·ãã¥ã¬ãŒãããŠå®çŸããæ¹æ³ãæ¢ããŸãã
ããŒã2.è¹ã®æ¹å-1ã
ãã©ããªã¢ãªãºã ã®äžçãžã®æ
ã«ã¯ãå
ãã©ã®ããã«æ©èœãããã ãã§ãªããè²ãã©ã®ããã«ç¥èŠããããçè§£ããå¿
èŠããããŸãã è¹ã«ã¯ããã€ã®è²ããããŸããïŒ ãªããã³ã¯ãå«ãŸããŠããªãã®ã§ããïŒ ããã§ã¯ããã®ããŒãã§åãäžããåé¡ã®äžéšã玹ä»ããŸãã
ã¯ããã«
ãã®ããŒãã§ã¯ãè¹è²ãåçŸããããã«ã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ã¹ã§äœ¿çšãããæãäžè¬çãªææ³ã«ã€ããŠåŠã³ãŸãã ããã¯ç¡é§ãªéåã®ããã«æãããããããŸããããå®éã«ã¯éåžžã«å®çšçã§ãã è¹ã®åè²ã¯ãå
ã®ç¹å®ã®æ³¢é·ã«å¯Ÿå¿ããŠããŸãã ãã®ãããªé©åã«ãããç©ççã«æå¹ãªåå°ãã·ãã¥ã¬ãŒãã§ããŸãã
次ã®ãImproving the Rainbow-2ãã§ã¯ãã·ã§ãŒããŒã«æé©åãããåæã«çŸæç¹ã§æè¯ã®çµæãçã¿åºãæ°ããã¢ãããŒãã玹ä»ããŸãïŒä»¥äžãåç
§ïŒã
ãã®ãã¥ãŒããªã¢ã«ã§èª¬æãããã¹ãŠã®ææ³ã®WebGLããŒãžã§ã³ã®æ¯èŒã¯ã
Shadertoyã«ãããŸãã
è±ã®ç¥èŠ
ç¶²èã¯ãå
ãèªèããç®ã®éšåã§ãã ç¹å®ã®æ³¢é·ã®å
ãèªèãããšè³ã«ä¿¡å·ãäŒéã§ãã
éäœçްèããããŸãã å
ã¯é»ç£çå
ã®æ³¢ãªã®ã§ãã³ãŒã³ã¯é»æ³¢ãèªèããã®ãšåãåçã«åŸã£ãŠæ©èœããŸãã
ããã¡ã¯ãã³ãŒã³ã¯å°ããªã¢ã³ããã§ãã ãšã¬ã¯ãããã¯ã¹ãç ç©¶ããããšãããå Žåãã¢ã³ããã®é·ãã¯ããã¯ã¢ããããæ³¢é·ã«é¢ä¿ããŠããããšãç¥ã£ãŠããå¿
èŠããããŸãã ããã人éã®ç®ã«ã¯3çš®é¡ã®éäœãååšããçç±ã§ãïŒçãäžãé·ã åã¿ã€ãã¯ãç¹å®ã®æ³¢é·ç¯å²ã®èªèã«ç¹åããŠããŸãã
äžèšã®ã°ã©ãã¯ãåã¿ã€ãã®ã³ãŒã³ãç°ãªãæ³¢é·ã«ã©ã®ããã«åå¿ãããã瀺ããŠããŸãã ãããã®ã¿ã€ãã®ã³ãŒã³ã®1ã€ãã¢ã¯ãã£ãã«ãªããšãè³ã¯ãã®ä¿¡å·ãè²ãšããŠè§£éããŸãã ããã¯ããèšãããŸãããçããäžçšåºŠãé·ãåéã¯ç¹å®ã®è²ã«å¯Ÿå¿ããŠããŸããã ããå
·äœçã«ã¯ãåã¿ã€ãã¯ç°ãªãè²ç¯å²ã«å¯ŸããŠç°ãªãåå¿ã瀺ããŸãã
çãââäžãé·ã®åéãéãç·ãèµ€ãèªèãããšä»®å®ããã®ã¯ééã£ãŠããŸãã ããã«ãããããããå€ãã®æç§æžïŒããã³ã·ã§ãŒããŒãïŒïŒã¯ããã®ããªãè€éãªçŸè±¡ã®æ¯èŒç蚱容å¯èœãªè¿äŒŒãäœæããããã«ãã®ä»®å®ãè¡ããŸãã
ã¹ãã¯ãã«è²
ç¡å·®å¥ãå¯èœã«ããç©ççŸè±¡ãåçŸãããå Žåã¯ãã³ã³ãã¥ãŒã¿ãŒã§è²ãä¿åããã³åŠçããæ¹æ³ãåèããå¿
èŠããããŸãã UnityïŒãŸãã¯ä»ã®ã²ãŒã ãšã³ãžã³ïŒã§å
æºãäœæãããšããèµ€ãç·ãéã®3ã€ã®äž»èŠã³ã³ããŒãã³ãã®æ··åãšããŠè²ãèšå®ã§ããŸãã èµ€ãç·ãéã®çµã¿åããã¯å®éã«ãã¹ãŠã®å¯èŠè²ãäœæã§ããŸãããæãåºæ¬çãªã¬ãã«ã§ã¯ãå
ã®åãã¯ç°ãªããŸãã
å
æºã¯ãäžå®ã®å
åæãšããŠã¢ãã«åã§ããŸãã ç°ãªãéã®ãšãã«ã®ãŒãéã¶å
åã¯ãç§ãã¡ã®ç®ã«ã¯ç°ãªãè²ãšããŠç¥èŠãããŸãã ãã ãããçœè²å
åãã¯ååšããŸããã ããã¯å€ãã®å
åã®åèšã§ããããããããç°ãªãæ³¢é·ãæã¡ãå
ã«çœè²ãäžããŸãã
å
ã«é²ãã«ã¯ãå
èªäœã®ããã«ãã£ã³ã°ãããã¯ãã«ã€ããŠè©±ãå¿
èŠããããŸãã ãæ³¢é·ãã«ã€ããŠè©±ããšãã¯ãè¹ã®ç¹å®ã®è²ã«ã€ããŠèãã䟡å€ããããŸãã ãã®ããŒãã§ã¯ããã®æ¥ç¶ãå®è£
ããããŸããŸãªã¢ãããŒãã瀺ããŸãã çµæãšããŠãäžããããè²ã«å¯ŸããŠç¥èŠãããè²ãè¿ã颿°ãååŸãããïŒ
fixed3 spectralColor (float wavelength);
ãã¹ãã®æ®ãã§ã¯ãæ³¢é·ãããã¡ãŒãã«ïŒ10ååã®1ã¡ãŒãã«ïŒã§è¡šããŸãã 人éã®ç®ã¯ã400 nmã700 nmã®ç¯å²ã®å
ãç¥èŠã§ããŸãã ãã®ç¯å²å€ã®æ³¢é·ã¯ååšããŸãããè²ãšããŠèªèãããŸããã
æé©ãªãœãªã¥ãŒã·ã§ã³ããªãã®ã¯ãªãã§ããïŒEarl F. Glynnããã®è³ªåã«æãããçããŸããã
ãæ³¢é·ãšRGBå€ã®éã«ã¯äžæã®å¯Ÿå¿é¢ä¿ã¯ãããŸããã è²ã¯ãç©çåŠãšäººéã®ç¥èŠã®é©ãã¹ãçµã¿åããã§ããã
æ³¢é·ãšè²ã®
æçµçã«æ£ãã察å¿ã®æ€çŽ¢ã¯ãå¿
ç¶çã«å€±æã«
çµãããŸã ã å
ã®æ§è³ªã¯å®¢èгçã§ãããç§ãã¡ã®ç¥èŠã¯ããã§ã¯ãããŸããã å¯èŠã¹ãã¯ãã«ã®ç¹å®ã®æ³¢é·ãç¥èŠããã³ãŒã³ã¯ã人ã«ãã£ãŠå€§ããç°ãªããŸãã ãã¹ãŠã®éäœããã¹ãŠã®äººã
ã«å¯ŸããŠåãã§äžå®ã§ãããšä»®å®ãããšããŠãããããã®ååžãšç¶²èå
ã®æ°ã¯ã»ãšãã©ã©ã³ãã ã§ãã 1人ã§ãã£ãŠãã2ã€ã®ç¶²èã¯åãã§ã¯ãããŸããã
æåŸã«ãè²ã®ç¥èŠã¯ãè³ããã®å
¥åãã©ã®ããã«ç¥èŠãããã«äŸåããŸãã ãã®ãããããŸããŸãªé¯èŠãç¥çµé©å¿ãçããè²ã®ç¥èŠããŠããŒã¯ã§çã«å人çãªäœéšã«ããŸãã
ã¹ãã¯ãã«ããã
äžã®å³ã¯ãé·ãã400ããã¡ãŒãã«ïŒéïŒãã700ããã¡ãŒãã«ïŒèµ€ïŒã®ç¯å²ã®æ³¢ã人éã®ç®ãã©ã®ããã«ç¥èŠãããã瀺ããŠããŸãã
å¯èŠã¹ãã¯ãã«ã®è²ã®ååžãéåžžã«éç·åœ¢ã§ããããšã¯ç°¡åã«ããããŸãã åæ³¢é·ã®ã°ã©ãã«ç¥èŠè²ã®å¯Ÿå¿ããæåRãGãBããããããããšãçµæãšããŠåæ§ã®çµæãåŸãããŸãã
ãã®æ²ç·ãå®å
šã«èª¬æã§ããåçŽãªé¢æ°ã¯ãããŸããã æãåçŽã§å®äŸ¡ãªå®è£
ã¢ãããŒãã¯ãè²ã«æ³¢é·ãä»å ããææ®µãšããŠã·ã§ãŒããŒã§ãã®ãã¯ã¹ãã£ã䜿çšããããšã§ãã
æåã«è¡ãããšã¯ãã·ã§ãŒããŒã«æ°ãããã¯ã¹ãã£ãžã®ã¢ã¯ã»ã¹ãæäŸããããšã§ãã ãããè¡ãã«ã¯ãæ°ããã·ã§ãŒããŒã®
Properties
ãããã¯ã«ãã¯ã¹ãã£ããããã£ã远å ã
Properties
ã
// Properties { ... _SpectralTex("Spectral Map (RGB)",2D) = "white" {} ... } // SubShader { ... CGPROGRAM ... sampler2D _SpectralTex; ... ENDCG ... }
spectrumColor颿°ã¯ãéé[400,700]ã®æ³¢é·ãåã«éé[0,1]ã®UV座æšã«å€æããŸãã
fixed3 spectral_tex (float wavelength) {
ç¹å®ã®ã±ãŒã¹ã§ã¯ãæ³¢é·ãéé[400ã700]ã«åŒ·å¶çã«å¶éããå¿
èŠã¯ãããŸããã
RepeatïŒClampã䜿çšããŠã¹ãã¯ãã«ãã¯ã¹ãã£ãã€ã³ããŒããããšããã®ç¯å²å€ã®ãã¹ãŠã®å€ã¯èªåçã«é»ã«ãªããŸãã
ã«ãŒããã¯ã¹ãã£ãµã³ããªã³ã°ä»¥äžã§ãè¹åœ©ã®å¹æãåçŸããã«ã¯ãè¹ããããã€ãã®è²ããµã³ããªã³ã°ããå¿
èŠãããããšãããããŸãã äžéšã®ããã€ã¹ã§ã¯ãã·ã§ãŒããŒãã«ãŒãå
ã®ãã¯ã¹ãã£ã®ãµã³ããªã³ã°ããµããŒãããŠããªãå ŽåããããŸãã ããã¯ãç¹ã«ã¢ãã€ã«ãã©ãããã©ãŒã ã§ã¯ããã¯ã¹ãã£ã䜿çšããããšãæåã®ã¢ãããŒãã§ã¯ãªãå¯èœæ§ãããæãéèŠãªçç±ã§ãã
JETã«ã©ãŒã¹ããŒã
ãã¯ã¹ãã£ã®ãµã³ããªã³ã°ã¯è¯ãã¢ã€ãã¢ã®ããã«æãããããããŸããã ãã ããã·ã§ãŒããŒã®é床ã倧å¹
ã«äœäžããå¯èœæ§ããããŸãã åãã¯ã»ã«ãè€æ°ã®ãã¯ã¹ãã£ãµã³ãã«ãå¿
èŠãšããCD-ROMã®ç¡å·®å¥æ§ã®èгç¹ããããããã©ãã»ã©éèŠã§ããããããããŸãã
å
ã¹ãã¯ãã«ã®è²ååžãè¿äŒŒãã颿°ãããã€ããããŸãã ããããæãç°¡åãªãã®ã®1ã€ã¯ãJETã«ã©ãŒã¹ããŒã ã§ãã ãã®é
è²ã¯ãMATLABã§æ¢å®ã§äœ¿çšãããå®å®ç©çåŠã«ãããæµäœãžã§ããã®ã·ãã¥ã¬ãŒã·ã§ã³ã®èŠèŠåãæ¹åããããã«ãå
ã¯åœç«ã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒã¢ããªã±ãŒã·ã§ã³ã»ã³ã¿ãŒã«ãã£ãŠéçºãããŸããã
JETã«ã©ãŒã¹ããŒã ã¯ãéãç·ãèµ€ã®3ã€ã®ç°ãªãæ²ç·ã®çµã¿åããã§ãã ããã¯ãè²ãåå²ãããšãã«ã¯ã£ãããšèŠãããŸãã
äžèšã®ã¹ããŒã ãæ§æããç·ã®æ¹çšåŒãèšè¿°ããããšã«ãããJETã«ã©ãŒã¹ããŒã ãèªåã§ç°¡åã«å®è£
ã§ããŸãã
// MATLAB Jet fixed3 spectral_jet(float w) { // w: [400, 700] // x: [0, 1] fixed x = saturate((w - 400.0)/300.0); fixed3 c; if (x < 0.25) c = fixed3(0.0, 4.0 * x, 1.0); else if (x < 0.5) c = fixed3(0.0, 1.0, 1.0 + 4.0 * (0.25 - x)); else if (x < 0.75) c = fixed3(4.0 * (x - 0.5), 1.0, 0.0); else c = fixed3(1.0, 1.0 + 4.0 * (0.75 - x), 0.0); // [0,1] return saturate(c); }
çµæã®è²ã®RãGãããã³Bã®å€ã¯ãCg
saturate
颿°ã䜿çšããŠéé[0.1]ã«å¶éãããŸãã ã«ã¡ã©ã«å¯ŸããŠHDRïŒ
ãã€ãã€ãããã¯ã¬ã³ãžã¬ã³ããªã³ã° ïŒãéžæãããŠããå Žåãããã¯ã1ãã倧ããã³ã³ããŒãã³ãã®è²ã®ååšãé¿ããããã«å¿
èŠã§ãã
JETã«ã©ãŒã¹ããŒã ãå³å¯ã«éµå®ãããå Žåãå¯èŠç¯å²å€ã®å€ã¯é»ã«ãªããªãããšã«æ³šæããŠãã ããã
ãã«ãŒãã³ã®é
è²
æ³¢é·ãå¯èŠè²ã«å€æããå¥ã®ã¢ãããŒãã¯ãDan Brutonã®èšäºã
Visible RGB values for Visible Wavelengths ãã§ææ¡ãããã¹ããŒã ã§ãã JETã«ã©ãŒã¹ããŒã ã§èµ·ããããšãšåæ§ã«ãBrutonã¯ç¥èŠãããè²ã®ããããã®ååžããå§ãŸããŸãã
ãããã圌ã®ã¢ãããŒãã¯é·ãåéã®æŽ»åãããããè¿äŒŒããŠãããå¯èŠã¹ãã¯ãã«ã®äžéšã«åŒ·ã玫ã®é°åœ±ããããããŸãã
ãã®ã¢ãããŒãã¯ã次ã®ã³ãŒãã«å€æãããŸãã
// fixed3 spectral_bruton (float w) { fixed3 c; if (w >= 380 && w < 440) c = fixed3 ( -(w - 440.) / (440. - 380.), 0.0, 1.0 ); else if (w >= 440 && w < 490) c = fixed3 ( 0.0, (w - 440.) / (490. - 440.), 1.0 ); else if (w >= 490 && w < 510) c = fixed3 ( 0.0, 1.0, -(w - 510.) / (510. - 490.) ); else if (w >= 510 && w < 580) c = fixed3 ( (w - 510.) / (580. - 510.), 1.0, 0.0 ); else if (w >= 580 && w < 645) c = fixed3 ( 1.0, -(w - 645.) / (645. - 580.), 0.0 ); else if (w >= 645 && w <= 780) c = fixed3 ( 1.0, 0.0, 0.0 ); else c = fixed3 ( 0.0, 0.0, 0.0 ); return saturate(c); }
ã«ã©ãŒã¹ããŒã ãã³ã
JETãšBrutonã®é
è²ã¯ãäžé£ç¶é¢æ°ã䜿çšããŸãã ãããã£ãŠãéåžžã«ã·ã£ãŒããªã«ã©ãŒããªãšãŒã·ã§ã³ãäœæãããŸãã ãŸããå¯èŠç¯å²å€ã§ã¯ãé»ã«ãªããŸããã æ¬ãGPU Gemsãã§ã¯ããã®åé¡ã¯ä»¥åã®é
è²ã®å³ããã©ã€ã³ãããæ»ãããª
ãã³ãã«çœ®ãæããããšã§è§£æ±ºãããŠããŸãã åãã³ãã¯ã次ã®åœ¢åŒã®èŠåçãªæŸç©ç·ã§ãã
ã ããå
·äœçã«
bump \ leftïŒx \ rightïŒ= \ left \ {\ begin {matrix} 0ïŒ\ left | x \ right |> 1 \\ 1-x ^ 2ïŒ\ mathit {otherwise} \ end {matrix} \ right ã
ã¹ããŒã ã®äœæè
ã§ããRandima Fernandoã¯ã次ã®ããã«é
眮ããããã¹ãŠã®ã³ã³ããŒãã³ãã«æŸç©ç·ã䜿çšããŸãã
次ã®ã³ãŒããæžãããšãã§ããŸãã
// GPU Gems inline fixed3 bump3 (fixed3 x) { float3 y = 1 - x * x; y = max(y, 0); return y; } fixed3 spectral_gems (float w) { // w: [400, 700] // x: [0, 1] fixed x = saturate((w - 400.0)/300.0); return bump3 ( fixed3 ( 4 * (x - 0.75), // Red 4 * (x - 0.5), // Green 4 * (x - 0.25) // Blue ) ); }
ãã®é
è²ã®ãã1ã€ã®å©ç¹ã¯ããã¯ã¹ãã£ãµã³ãã«ãšåå²ã䜿çšããªãããšã§ããããã¯ãå質ãããé床ãåªå
ããå Žåã«æé©ãªãœãªã¥ãŒã·ã§ã³ã®1ã€ã«ãªããŸãã ãã®ãã¥ãŒããªã¢ã«ã®æåŸã«ããã®é
è²ã®æ¹èšçã瀺ããŸããããã«ãããé«è§£å床ã®è²ãç¶æããªãããããé«éã«ãªããŸãã
ã¹ãã¯ã¿ãŒã®é
è²
æãæ£ç¢ºãªé
è²ã®1ã€ã¯ããŠãŒã¶ãŒStack Overflow
Spektreã«ãã£ãŠäœæããããã®ã§ãã 圌ã¯ã
å¯èŠã¹ãã¯ãã«ãã¹ãã®
RGBå€ã§åœŒã®æ¹æ³è«ã説æãã倪éœã¹ãã¯ãã«ããææããŒã¿ã®éãç·ãèµ€ã®æåããµã³ããªã³ã°ããŸãã ãã®åŸãåçŽãªé¢æ°ã§åã
ã®ééãåããŸãã çµæãæ¬¡ã®å³ã«ç€ºããŸãã
æäŸãããã®ïŒ
ãããŠãããã«ã³ãŒãããããŸãïŒ
// Spektre fixed3 spectral_spektre (float l) { float r=0.0,g=0.0,b=0.0; if ((l>=400.0)&&(l<410.0)) { float t=(l-400.0)/(410.0-400.0); r= +(0.33*t)-(0.20*t*t); } else if ((l>=410.0)&&(l<475.0)) { float t=(l-410.0)/(475.0-410.0); r=0.14 -(0.13*t*t); } else if ((l>=545.0)&&(l<595.0)) { float t=(l-545.0)/(595.0-545.0); r= +(1.98*t)-( t*t); } else if ((l>=595.0)&&(l<650.0)) { float t=(l-595.0)/(650.0-595.0); r=0.98+(0.06*t)-(0.40*t*t); } else if ((l>=650.0)&&(l<700.0)) { float t=(l-650.0)/(700.0-650.0); r=0.65-(0.84*t)+(0.20*t*t); } if ((l>=415.0)&&(l<475.0)) { float t=(l-415.0)/(475.0-415.0); g= +(0.80*t*t); } else if ((l>=475.0)&&(l<590.0)) { float t=(l-475.0)/(590.0-475.0); g=0.8 +(0.76*t)-(0.80*t*t); } else if ((l>=585.0)&&(l<639.0)) { float t=(l-585.0)/(639.0-585.0); g=0.82-(0.80*t) ; } if ((l>=400.0)&&(l<475.0)) { float t=(l-400.0)/(475.0-400.0); b= +(2.20*t)-(1.50*t*t); } else if ((l>=475.0)&&(l<560.0)) { float t=(l-475.0)/(560.0-475.0); b=0.7 -( t)+(0.30*t*t); } return fixed3(r,g,b); }
ãããã«
ãã®ããŒãã§ã¯ãã·ã§ãŒããŒã§è¹ã®ãããªãã¿ãŒã³ãçæããããã®æãäžè¬çãªææ³ãããã€ãèŠãŠããŸããã æ¬¡ã®ããŒãã§ã¯ããã®åé¡ã解決ããããã®æ°ããã¢ãããŒãã玹ä»ããŸãã
åœ¹è· | åŸé
|
ãžã§ããæ© |  |
ãã«ãŒãã³ |  |
GPUãžã§ã |  |
ã¹ãã¯ã¿ãŒ |  |
ãºãã³ã |  |
ãºãã³ã6 |  |
å¯èŠã¹ãã¯ãã« |  |
ããŒã3.è¹ã®æ¹å-2ã
ã¯ããã«
åã®ããŒãã§ã¯ãé»ç£ã¹ãã¯ãã«ã®å¯èŠç¯å²ïŒ400ã700ããã¡ãŒãã«ïŒã®æ³¢é·ãããããã®è²ã«å€æãã4ã€ã®ç°ãªãæ¹æ³ãåæããŸããã
ãããã®ãœãªã¥ãŒã·ã§ã³ã®ãã¡3ã€ïŒJETãBrutonãããã³SpektreïŒã¯
ifæ§é ãç©æ¥µçã«äœ¿çšããŸãã ããã¯CïŒã®æšæºçãªææ³ã§ãããã·ã§ãŒããŒã§ã¯åå²ã¯æªãã¢ãããŒãã§ãã åå²ã䜿çšããªãå¯äžã®ã¢ãããŒãã¯ãGPU Gemsããã¯ã§èª¬æãããŠããã¢ãããŒãã§ãã ãã ããå¯èŠã¹ãã¯ãã«ã®è²ã®æé©ãªè¿äŒŒå€ã¯æäŸãããŸããã
åœ¹è· | åŸé
|
GPUãžã§ã |  |
å¯èŠã¹ãã¯ãã« |  |
ãã®ããŒãã§ã¯ãGPU Gemsãšããæ¬ã§èª¬æãããŠããã«ã©ãŒã¹ããŒã ã®æé©åããŒãžã§ã³ã«ã€ããŠèª¬æããŸãã
ãã³ãã«ã©ãŒã¹ããŒã
GPU Gemsããã¯ã§æŠèª¬ãããŠããå
ã®ã«ã©ãŒã¹ããŒã ã¯ã3ã€ã®æŸç©ç·ïŒèè
ã«ãã£ãŠãã³ããšåŒã°
ããŸã ïŒã䜿çšããŠãè¹è²ã®RãGãããã³Bã³ã³ããŒãã³ãã®ååžãåçŸããŸãã
åãã³ãã¯ã次ã®åŒã§èšè¿°ãããŸãã
bump \ leftïŒx \ rightïŒ= \ left \ {\ begin {matrix} 0ïŒ\ left | x \ right |> 1 \\ 1-x ^ 2ïŒ\ mathit {otherwise} \ end {matrix} \ right ã
åæ³¢é·
ç¯å²[400ã700]ã¯ãæ£èŠåãããå€ã«ãããã³ã°ãããŸã
éé[0,1]ã§ã 次ã«ãå¯èŠã¹ãã¯ãã«ã®æåRãGãBãæ¬¡ã®ããã«å®çŸ©ããŸãã
ãã¹ãŠã®æ°å€ã¯ãå®éšçã«èè
ã«ãã£ãŠéžæãããŠããŸãã ãã ããå®éã®è²ã®ååžã«ã©ãã ã察å¿ããŠããªãããããããŸãã
åè³ªã®æé©å
ç§ãæåã«æãã€ãã解決çã§ã¯ãGPU Gemsã®ã«ã©ãŒã¹ããŒã ãšãŸã£ããåãæ¹çšåŒã䜿çšãããŸããã ãã ãããã¹ãŠã®æ°å€ãæé©åããŠãæçµçãªè²ã®ç¯å²ãå¯èœãªéãå¯èŠã¹ãã¯ãã«ã®å®éã®è²ãšäžèŽããããã«ããŸããã
çµæã¯ã次ã®ãœãªã¥ãŒã·ã§ã³ã«èŠçŽãããŸãã
ãããŠãããçŸå®çãªçµæã«ã€ãªãããŸãã
åœ¹è· | åŸé
|
GPUãžã§ã |  |
ãºãã³ã |  |
å¯èŠã¹ãã¯ãã« |  |
å
ã®ãœãªã¥ãŒã·ã§ã³ãšåæ§ã«ãæ°ããã¢ãããŒãã«ã¯åå²ãå«ãŸããŠããŸããã ãããã£ãŠãã·ã§ãŒããŒã«æé©ã§ãã ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
// GPU Gems // inline fixed3 bump3y (fixed3 x, fixed3 yoffset) { float3 y = 1 - x * x; y = saturate(y-yoffset); return y; } fixed3 spectral_zucconi (float w) { // w: [400, 700] // x: [0, 1] fixed x = saturate((w - 400.0)/ 300.0); const float3 cs = float3(3.54541723, 2.86670055, 2.29421995); const float3 xs = float3(0.69548916, 0.49416934, 0.28269708); const float3 ys = float3(0.02320775, 0.15936245, 0.53520021); return bump3y ( cs * (x - xs), ys); }
ããªãã®æ±ºå®ã«ã€ããŠãã£ãšæããŠãã ããïŒæé©åã¢ã«ãŽãªãºã ãèŠã€ããããã«ãPython
scikitã©ã€ãã©ãªãŒã䜿çšããŸããã
çµæãåçŸããããã«å¿
èŠãªãªãã·ã§ã³ã¯æ¬¡ã®ãšããã§ãã
- ã¢ã«ãŽãªãºã ïŒL-BFGS-B
- å
¬å·®ïŒ
- å埩ïŒ
- å éMSEïŒ
- ãã£ããã£ã³ã°
- å
ã®ãœãªã¥ãŒã·ã§ã³ïŒ
- æçµçãªè§£æ±ºçïŒ
è¹ã®æ¹å
å¯èŠã¹ãã¯ãã«ã®è²ã®ååžã詳ããèŠããšãæŸç©ç·ã¯å®éã«ã¯RãGãBã®è²æ²ç·ãç¹°ãè¿ãããšãã§ããªãããšã«æ°ä»ãã§ãããã3ã€ã§ã¯ãªã6ã€ã®æŸç©ç·ã䜿çšããæ¹ãè¯ãã§ãããã åã¡ã€ã³ã³ã³ããŒãã³ãã«2ã€ã®ãã³ããåãä»ããããšã«ãããããæ£ç¢ºãªè¿äŒŒãåŸãããŸãã éãã¯ãã¹ãã¯ãã«ã®çŽ«è²ã®éšåã§éåžžã«é¡èã§ãã
éãã¯ãã¹ãã¯ãã«ã®çŽ«ãšãªã¬ã³ãžã®éšåã§ã¯ã£ãããšèŠããŸãã
åœ¹è· | åŸé
|
ãºãã³ã |  |
ãºãã³ã6 |  |
å¯èŠã¹ãã¯ãã« |  |
ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
// GPU Gems // fixed3 spectral_zucconi6 (float w) { // w: [400, 700] // x: [0, 1] fixed x = saturate((w - 400.0)/ 300.0); const float3 c1 = float3(3.54585104, 2.93225262, 2.41593945); const float3 x1 = float3(0.69549072, 0.49228336, 0.27699880); const float3 y1 = float3(0.02312639, 0.15225084, 0.52607955); const float3 c2 = float3(3.90307140, 3.21182957, 3.96587128); const float3 x2 = float3(0.11748627, 0.86755042, 0.66077860); const float3 y2 = float3(0.84897130, 0.88445281, 0.73949448); return bump3y(c1 * (x - x1), y1) + bump3y(c2 * (x - x2), y2) ; }
spectrum_zucconi6ãåå²ããã«åªããè²è¿äŒŒãæäŸããããšã¯ééããããŸããã é床ãéèŠãªå Žåã¯ãã¢ã«ãŽãªãºã ã®ç°¡æããŒãžã§ã³-spectrum_zucconiã䜿çšã§ããŸãã
ãŸãšãããš
ãã®ããŒãã§ã¯ãã·ã§ãŒããŒã§è¹ã®ãããªãã¿ãŒã³ãçæããæ°ããã¢ãããŒããæ€èšããŸããã
åœ¹è· | åŸé
|
ãžã§ããæ© |  |
ãã«ãŒãã³ |  |
GPUãžã§ã |  |
ã¹ãã¯ã¿ãŒ |  |
ãºãã³ã |  |
ãºãã³ã6 |  |
å¯èŠã¹ãã¯ãã« |  |
ããŒã4.åææ Œåãçè§£ãã
ãã¥ãŒããªã¢ã«ã®æåã®éšåã§ã¯ãæ³¢ãšç²åã®ç¹æ§ã瀺ãå
ã®äºéã®æ§è³ªã«ç²ŸéããŸããã ãã®ããŒãã§ã¯ããªãããã2ã€ã®åŽé¢ã®äž¡æ¹ãç¡å·®å¥ã®çºçã«å¿
èŠã§ããããèŠãŠãããŸãã
åå°ïŒå
ãšé¡
ç§åŠæç®ã§ã¯ã
å
ç·ã¯ ãå®å®ç©ºéã§å
åãç§»åããç©äœãšçžäºäœçšããçµè·¯ãç€ºãæ¹æ³ãšããŠãã°ãã°èšåãããŠããŸãã ã»ãšãã©ã®
ã·ã§ãŒãã£ã³ã°ã¢ãã«ã§ã¯
ãå
ã¯
ãå®ç§ãªããªã€ãŒãããŒã«ã®ããã«æ¯ãèãå質ãªç²åããçæããããšèªèãããŸãã äžè¬çãªå Žåãå
ç·ã衚é¢ã«è¡çªãããšãåãååè§ã§åå°ããŸãã ãã®ãããªè¡šé¢ã¯å®å
šãªé¡ã®ããã«æ¯ãèããå
ãå®å
šã«åå°ããŸãã
ãã®ææ³ã䜿çšããŠã¬ã³ããªã³ã°ããããªããžã§ã¯ãã¯ããã©ãŒã®ãããªãã®ã§ãã ããã«ãå
ã
Læ¹åããèœã¡ãå Žåã芳å¯è
ã¯
Ræ¹åããèŠããšãã«ã®ã¿ãããèŠãããšãã§ããŸãã ãã®ã¿ã€ãã®åå°ã¯
é¡é¢åå°ãšãåŒã°ããé¡ã®ãããªæå³ã§ãã
çŸå®ã®äžçã§ã¯ãã»ãšãã©ã®ãªããžã§ã¯ãã¯
æ¡æ£ãšåŒã°ããç°ãªãæ¹æ³ã§å
ãåå°ããŸãã å
ç·ãæ£ä¹±é¢ã«åœãããšãã»ãŒãã¹ãŠã®æ¹åã«åäžã«æ£ä¹±ãããŸãã ããã«ããããªããžã§ã¯ãã«åäžãªæ¡æ£è²ãäžããããŸãã
ææ°ã®ãšã³ãžã³ïŒUnityãUnrealãªã©ïŒã§ã¯ãããã2ã€ã®åäœã¯ç°ãªãæ¹çšåŒã®ã»ããã䜿çšããŠã¢ãã«åãããŸãã ååã®
ç©çããŒã¹ã®ã¬ã³ããªã³ã°ãšç
§æã¢ãã«ã®ãã¥ãŒããªã¢ã«ã§ã¯ãæ¡æ£åå°ãšé¡é¢åå°ã«ãããã䜿çšããã
ã©ã³ããŒã åå°ã¢ãã«ãš
ããªã³ãã©ã³ åå°ã¢ãã«ã«ã€ããŠèª¬æããŸããã
ç°ãªã£ãŠèŠãããšããäºå®ã«ãããããããæ¡æ£åå°ã¯ãã©ãŒãéããŠèª¬æã§ããŸãã å®å
šã«å¹³ããªè¡šé¢ã¯ãããŸããã å°ããªé¡ããäœæãããç²ã衚é¢ãã·ãã¥ã¬ãŒãã§ããŸããåé¡ã¯é¡é¢åå°çã«ãã£ãŠå®å
šã«ç¹åŸŽä»ããããŸãã ãã®ãããª
埮å°é¢ã®ååšã¯ãããããæ¹åã®å
ç·ã®æ£ä¹±ããããããŸãã
ãã®ãããªãã€ã¯ããã¡ã»ããã®å€æ¹åæ§ã¯ãå€ãã®å Žåã
Smoothnessã
Roughnessãªã©ã®ããããã£ã䜿çšããç©ççã«æ£ç¢ºãªã·ã§ãŒããŒã«ãã£ãŠã¢ãã«åãããŸãã ãã®è©³çްã«ã€ããŠã¯ãUnityãã«ãããŒãžã§æšæºãšã³ãžã³ã·ã§ãŒããŒã®
Smoothnessããããã£ã«ã€ããŠèª¬æããŠããŸãã

åå°çã¯ã©ãã§ããïŒãã®ã»ã¯ã·ã§ã³ã§ã¯ãæ¡æ£ïŒæ¡æ£ïŒåå°ã¯ã倿¹åã®åŸ®å°é¢ã§æ§æããã衚é¢ã§ã®é¡é¢åå°ãèæ
®ããããšã§å®å
šã«èª¬æã§ãããšè¿°ã¹ãŸããã ãã ããããã¯å®å
šã«çå®ã§ã¯ãããŸããã 衚é¢ãé¡é¢åå°ã®ã¿ã瀺ãå Žåãããã¯å®å
šã«ç 磚ãããšé»ãèŠããããšãæå³ããŸãã çœã倧çç³ã¯è¯ãåäŸãšèããããšãã§ããŸããç 磚ããªããšé»ããªããŸããã å®å
šã«æ»ãããªè¡šé¢ãéæã§ãããšããŠããçœã倧çç³ã¯ãŸã çœãæ¡æ£åå°æåã瀺ããŸãã
ãããŠå®éããã®å¹æã«ã¯ä»ã®äœããé¢äžããŠããŸãã 衚é¢ã®æ¡æ£æåã¯ã坿¬¡çãªãœãŒã¹ã§ãã
屿ãããçºçããŸãã å
ã¯ãªããžã§ã¯ãã®è¡šé¢ãééãããã®å
éšã§åå°ãããç°ãªãè§åºŠã§åºãããšãã§ããŸãïŒäžã®å³ãåç
§ïŒã ããã¯ããã¹ãŠã®å
¥å°å
ã®äžå®ã®å²åããä»»æã®ãã€ã³ãããã³ä»»æã®è§åºŠã§ææã®è¡šé¢ã«ãã£ãŠåæŸå°ãããããšãæå³ããŸãã ãã®æ¯ãèãã¯ãã°ãã°
衚é¢äžæ£ä¹±ãšåŒã°ã
ããããã·ãã¥ã¬ãŒãããããã®èšç®ã¯ãã°ãã°éåžžã«ã³ã¹ããããããŸãã
ãããã®å¹æïŒããã³ã·ãã¥ã¬ãŒã·ã§ã³ïŒã®è©³çްã«ã€ããŠã¯ãããŒã¢ã»ããã®
ç©çããŒã¹ã¬ã³ããªã³ã°ã®
åºæ¬çè«ãåç
§ããŠãã ãã ã
å
ã¯æ³¢ã®ããã§ã
å
ç·ãããŒãã£ã¯ã«ã§æ§æãããŠãããã®ããã«ã·ãã¥ã¬ãŒãããããšã¯éåžžã«äŸ¿å©ã§ãã ãã ããããã«ãããç¡å·®å¥ãå«ãå€ãã®è³æã瀺ãåäœãåçŸããããšã¯ã§ããŸããã ç¹å®ã®æ¡ä»¶ã®å
ãæ³¢ã®ããã«æ¯ãèããšããäºå®ãåãå
¥ããå Žåã«ã®ã¿ãããã€ãã®çŸè±¡ãå®å
šã«çè§£ããããšãã§ããŸãã
ã»ãšãã©ã®ã·ã§ãŒããŒã¯ãå
ãããŒãã£ã¯ã«ãšããŠäœ¿çšããŸãã ãã®å€§å¹
ãªç°¡çŽ åã®çµæã
远å ã®æ§æãè¡ãããŸãã 2ã€ã®å
ç·ã芳枬è
ã«å°éããå Žåããããã®æããã¯åçŽã«å ç®ãããŸãã ãµãŒãã§ã¹ãæŸå°ããå
ç·ãå€ãã»ã©ãæãããªããŸãã
çŸå®ã®äžçã§ã¯ãããã§ã¯ãããŸããã 2ã€ã®å
ç·ã芳枬è
ã«å°éããå Žåãæçµçãªè²ã¯ããããã®æ³¢ãçžäºäœçšããæ¹æ³ã«äŸåããŸãã 以äžã®ã¢ãã¡ãŒã·ã§ã³ã¯ã2ã€ã®åçŽãªæ£åŒŠæ³¢ã
äœçžã«å¿ããŠäºãã«
å¢å¹
ãŸãã¯
çžæ®º ããæ¹æ³ã瀺ããŠããŸãã
2ã€ã®æ³¢ã®
äœçžã
äžèŽãããšããã®ããŒã¯ãšè°·ãçæ³çã«äžèŽããŸãããã®å Žåãæçµçãªæ³¢ãå¢å¹
ãããŸãã ããã§ãªããã°ã圌ãã¯æåéããäºããç Žå£ããããšãã§ããŸãã ããã¯ã2ã€ã®å
ç·ãæ£ããæ§æã§èŠ³æž¬è
ã«åœãããšã芳枬è
ãå
ãåãåããªãããšãæå³ããŸãã
æ³¢ã®çžäºäœçšã¯å¥åŠãªåçã®ããã«èŠãããããããŸããã ããããç§ãã¡ã¯çãæ¥åžžçæŽ»ã§ãããçµéšããŸããã ç§åŠã®æ®åè
ã§ãããã¬ã¯ã»ãã¥ã©ãŒã¯ãããã圌ã®ãããª
ãThe Original Double Slit Experiment ãã§èª¬æããŠããŸãã
ããããããã¯å
ãšè¹è²ã«ã©ã®ããã«é¢ä¿ããŠããŸããïŒ è¹åœ©ã®çç±ã¯ãç°ãªãé·ãã®å
æ³¢ã®çžäºäœçšã§ãã äžéšã®ãããªã¢ã«ã¯ãæ£ããæ¹åã«ã®ã¿ãã©ãã³ãåå°ããç¹å®ã®è²ã匷調ããä»ãç Žå£ããŸãã ãã®çžäºäœçšã®çµæãšããŠãè¹ã芳å¯ã§ããŸãã
åæ
ãã®ããŒãã®æåã®ã»ã¯ã·ã§ã³ã§ã¯ãå
ãšç©è³ªã®çžäºäœçšã®ã¿ã€ãã®1ã€ã§ããåå°ã«ã€ããŠåŠç¿ããŸããã åå°ã¯ãå
ãç²åãšããŠã¢ãã«åããããšãã«çºçããŸãã ãã ãããããæ³¢ã®ããã«æ±ããšãæ°ããäžé£ã®åäœãçºçããŸãã ãããã®1ã€ã¯
åæãšåŒã°ããŸãã
ãã¹ãŠã®å
¥å°å
ãåãè§åºŠã§è¡šé¢ã«å°éããå Žåãããã¯å¹³é¢æ³¢ãšåŒã°ããŸããããšãã°ãUnityã®æåæ§å
æºã¯å¹³é¢æ³¢ãäœæããŸãã平颿³¢ãã®ã£ãããééãããšã次ã®ã¢ãã¡ãŒã·ã§ã³ã«ç€ºãããã«å±æããŸããå
ã2ã€ã®ç°ãªãã¹ãªãããééãããšã2ã€ã®æ°ããæ³¢é¢ãçæãããŸãããããŠãäžã§èšã£ãããã«ããããã®æ°ããå
æ³¢ã¯äºãã«çžäºäœçšããããšãã§ããŸãã以äžã®ã¢ãã¡ãŒã·ã§ã³ã¯ããã®ãããªã¹ãããã2ã€ããå Žåã®ã©ã€ãã®åäœã瀺ããŠããŸãããããã¯å®éã«çžäºäœçšããå
ç·ãå¢å¹
ããã³æ¶å
ããããšãããããŸããä»ãç§ãã¡ã¯ãç¡å·®å¥ã®åå ãè°è«ããããã«å¿
èŠãªåºç€ããã¹ãŠæã£ãŠããŸããåææ Œå
平颿³¢ãã¹ãªãããééããããç²ãã«åå°ãããšã屿ããæ°ããç颿³¢é¢ãäœæãããŸããããã¯ãæ¡æ£åå°ã§çºçããã®ãšåæ§ã«ãå
ããã¹ãŠã®æ¹åã«æ£ä¹±ãããããšãæå³ããŸããææã®è¡šé¢ãåäžã§ãªãå ŽåãçµæãšããŠçãã平颿³¢ã¯ã©ã³ãã ã«æ£ä¹±ãããé¡åŸ®é¡ã¬ãã«ã§å¹²æžãã¿ãŒã³ã¯çºçããŸããããã ããäžéšã®ææã«ã¯ãå
¥å°å
ã®æ³¢é·ã«å¹æµããã¹ã±ãŒã«ã§ç¹°ãè¿ããã衚é¢ãã¿ãŒã³ããããŸãããããçºçãããšããã¿ãŒã³ã®åçŸæ§ã«ãããåææ³¢ã®åé¢ã®ã©ã³ãã ã§ã¯ãªãçžäºäœçšãç¹°ãè¿ãããŸããçµæãšããŠçããçžäºäœçšã¯ãå·šèŠçãªã¬ãã«ã§èŠãããšãã§ããç¹°ãè¿ãã®å¹²æžãã¿ãŒã³ãäœæããŸããäžèšã®å¹æã¯åææ ŒåãšåŒã°ããŸããäžéšã®æ³¢é·ã¯å€§å¹
ã«å¢å¹
ãããä»ã®æ³¢é·ã¯ç Žå£ãããŸããç°ãªãæ³¢é·ãç°ãªãè²ã«å¯Ÿå¿ãããããåææ Œåã¯ãããã€ãã®è²ã®åå°ãããé¡èã«ãªããšããäºå®ã«ã€ãªãããŸãããã®ã¡ã«ããºã ã¯ãç¹°ãè¿ããã¿ãŒã³ãæã€è¡šé¢ã§ã®è¹åœ©ã®çºçãæäŸããŸãããããã¯èªç¶çã«ãã°ãã°èŠãããŸããæè«ã®å€éšéªšæ Œãšé³¥ã®çŸœã«ã¯ãç¹°ãè¿ããã¿ãŒã³ã§æŽåããé¡åŸ®é¡ã¹ã±ãŒã«ãå«ãŸããŠããŸããäžã®ç»åã§ã¯ãåéã®çŸœã®æ¡å€§ç»åã衚瀺ãããŠããŸãããŸãšãããš
ãã¥ãŒããªã¢ã«ã®æ¬¡ã®éšåã§ã¯ãç¹å®ã®çš®é¡ã®è¹åœ©ãæ°åŠçã«ã¢ãã«åããæ¹æ³ã瀺ããŸããæ¹çšåŒãå°åºããåŸãã·ã§ãŒããŒã§ç°¡åã«å®è£
ã§ããŸããããŒã5ãåææ Œåã®æ°åŠã
ã¯ããã«
åã®ããŒãã§ã¯ãäžéšã®çŽ æã§ç¡å·®å¥ãçºçããçç±ã«ã€ããŠèª¬æããŸãããããã§ããã®çŸè±¡ãæ°åŠçã«ã¢ãã«åããããã«å¿
èŠãªãã®ããã¹ãŠæããŸãããæ¢ç¥ã®è·é¢ã«ããã£ãŠç¹°ãè¿ãããäžåäžæ§ãããçŽ æãæç€ºããããšããå§ããŸããã ã
æ¹çšåŒãå°ãåºãããã«ãå
¥å°å
ç·ãšè¡šé¢æ³ç·ã®éã®è§åºŠã次ã®ããã«ç€ºããŸãã ã
ãŸãã芳枬è
ããã¹ãŠã®åå°å
ç·ãããè§åºŠã§åãåãããã«é
眮ãããŠããããšãæ³åããŠã¿ãŸããã ã
ããããã®äžåäžæ§ã¯å
ããã¹ãŠã®æ¹åã«æ£ä¹±ãããããã芳å¯è
ã«ã¯åžžã«é¢ä¿ãªãå
ç·ãå
¥å°ããŸã ã
ç°è³ªæ§ã¯å¢åã§å®æçã«ç¹°ãè¿ããããã ããã¡ãŒãã«ããã®åŸæ£ä¹±ãã¿ãŒã³èªäœãç¹°ãè¿ãããŸã ããã¡ãŒãã«ãããã¯ãåã¹ãªããããå°ãªããšã1ã€ã®å
ç·ã芳枬è
ã«å°éããããšãæå³ããŸããæ¹çšåŒã®å°åº
äžå³ã«ç€ºãããŠãã2ã€ã®å
ç·ã¯ã芳枬è
ã«å°éããåã«ç°ãªãè·é¢ãé²ã¿ãŸãããããã®2ã€ã®å
ç·ã®çžäºäœçšïŒçžäºã®å¢å¹
ãŸãã¯æå¶ïŒãçè§£ããããã«ã芳枬è
ã«å°éãããšãã«äœçžãäžèŽããªãéãèšç®ããå¿
èŠããããŸãããããã®2ã€ã®å
ç·ã¯ãæåã®å
ç·ã衚é¢ã«åœãããŸã§äœçžãå®å
šã«äžèŽããŸãã2çªç®ã®ããŒã ã¯äœåãªè·é¢ãç§»åããŸãïŒç·è²ã§åŒ·èª¿è¡šç€ºïŒããã®åŸè¡šé¢ã«ãèœã¡ãŸããåçŽãªäžè§æ³ã䜿çšããŠãç·ã®ç·ã®é·ãã çãã
ã
åæ§ã®æ§é ã䜿çšããŠãäœåãªè·é¢ãèšç®ã§ããŸã ã2çªç®ã®ããŒã ã衚é¢ã«è¡çªãããŸã§æåã®ããŒã ãééãããŸãããã®å Žåãæ¬¡ã®ããšãããããŸã ã
ããã2ã€ã®ã»ã°ã¡ã³ã 芳枬è
ãåä¿¡ãããšãã«2ã€ã®ããŒã ã®äœçžãäžèŽãããã©ããã倿ããããšãéèŠã§ãããããã®éãã¯ãããã2ã€ã®å
ç·ã®é·ãã®éããæž¬å®ããŸãããŒãã«çããå Žåã2ã€ã®å
ç·ã¯æ¬è³ªçã«åãè·é¢ãééããŠããããã2ã€ã®å
ç·ã®äœçžãäžèŽããŠããããšã確å®ã«ããããŸãããã ãããã®å Žåã ãã§ãªãã2ã€ã®å
ç·ã®äœçžãäžèŽããããšããããŸããé·ãã®å·®ãæ³¢é·ã®æŽæ°åã§ããå Žåãã®åŸã圌ãã¯ãŸã åçžã«ãªããŸããæ°åŠçãªèгç¹ããã¯ã2ã€ã®å
ç·ãæ¬¡ã®æ¡ä»¶ãæºããå ŽåãäœçžãäžèŽããŸãã
å¯èŠå
ãã®æ¹çšåŒã®æå³ãçè§£ããããã«å°ãæéãåããŸããããå
ãæãã«èœã¡ãå Žå ãææãæãããèŠããšãã«èгå¯è
ãèŠããã® ïŒ
ãã¹ãŠã®æ³¢é· æŽæ°åã§ããããš ãå¢å¹
ãšçžäºäœçšããæçµåå°ã«åŒ·ãçŸããŸãããããã£ãŠãèŠèŽè
ã«è¡šç€ºãããã®ã¯ãããã®è²ã§ãããã®å¹æã¯ãè€éãªã¢ãããŒãã®éåžžã«è峿·±ãè°è«ããåãããæ¬¡ã®å³ã«ãã£ãŠèŠèŠåãããŠããŸãïŒãµã€ã¯ã«ã®è¹è²ïŒçœãå
ç·ã¯ãé¡é¢åå°ã®ããã«å
åãç¶ãçµè·¯ããã©ããŸããçŽ æãããŸããŸãªè§åºŠããèŠããšãå圢ã®è¹æš¡æ§ãèŠããŸããåè²ã¯ããããã®æ³¢é·ã«å¯Ÿå¿ããé åºã«ãã£ãŠå¯Ÿå¿ããå
šäœã決ãŸããŸã ã
ã芧ã®ããã«ãåææ Œåæ¹çšåŒã¯è² ã®å€ã§ãæºããããŠããŸã éã®ãã è² ã®å€ã«ãªãå ŽåããããŸããèšç®ã®èгç¹ããã¯ãæ€çŽ¢ç©ºéãåçŽåããŠãæ£ã®å€ã®ã¿ã«å¶éããããšã¯çã«ããªã£ãŠããŸã ã
䜿çšããæ°ããæ¹çšåŒã¯æ¬¡ã®ãšããã§ãã
ããŒã6. CD-ROMã·ã§ãŒããŒïŒåææ Œå-1
ãã®ããŒãã§ã¯ãCD-ROMãŸãã¯DVDã®è¡šé¢ã«èŠããè¹ã®åå°ãåçŸããã·ã§ãŒããŒã®äœæã«ã€ããŠèª¬æããŸããã¯ããã«
åã®ããŒãã§ã¯ãããã€ãã®è¡šé¢ã§ç€ºãããè¹åœ©åå°ã®æ§è³ªãèšè¿°ããæ¹çšåŒãå°ãåºããŸãããè¹è²ã¯ã衚é¢ã«ç¹°ãè¿ããã¿ãŒã³ãååšããææã§çºçãããã®ãµã€ãºã¯ãåå°ããå
ã®æ³¢é·ã«å¹æµããŸããæçµçã«åçŸãããå
åŠå¹æã¯ãå
æºãšè¡šé¢æ³ç·ã®éã®è§åºŠïŒå
ã®æ¹åïŒã芳å¯è
ã®èŠè§ïŒèŠæ¹åïŒãããã³ç¹°ãè¿ãããã®ã£ããéã®è·é¢ã®3ã€ã®èŠå ã«æçµçã«äŸåããŸããã·ã§ãŒããŒã¯ãæšæºãããªã¢ã«ãéåžžäœæããéåžžã®å¹æã«è¹è²ã®åå°ã远å ããå¿
èŠããããŸãããã®ãããStandard Surfaceã·ã§ãŒããŒã®ã©ã€ãã£ã³ã°æ©èœã æ¡åŒµããŸãããã®æé ã«æ
£ããŠããªãå Žåã¯ããã¥ãŒããªã¢ã«ã®Physically Based Rendering and Lighting Modelsãå匷ãã䟡å€ããããŸãã衚é¢ã·ã§ãŒããŒã®äœæ
æåã®ã¹ãããã¯ãæ°ããã·ã§ãŒããŒãäœæããããšã§ããç©ççã«æ£ç¢ºãªç
§æãæ¢ã«ãµããŒãããŠããã·ã§ãŒããŒã®æ©èœãæ¡åŒµãããã®ã§ãæšæºã®è¡šé¢ã·ã§ãŒããŒããå§ããŸããããäœæãããCD-ROMã·ã§ãŒããŒã«ã¯ãæ°ããããããã£distanceãå¿
èŠã§ãã åææ Œåæ¹çšåŒã§äœ¿çšãããŸãããããã¯ã«è¿œå ããŠã¿ãŸãããProperties
ãããã¯æ¬¡ã®ããã«ãªããŸãã Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 _Metallic ("Metallic", Range(0,1)) = 0.0 _Distance ("Grating distance", Range(0,10000)) = 1600 // nm }
ããã§ããããªã¢ã«ã€ã³ã¹ãã¯ã¿ãŒã«æ°ããã¹ã©ã€ããŒãäœæããŸãããã ããããããã£_Distance
ã¯ã»ã¯ã·ã§ã³å
ã®å€æ°ã«é¢é£ä»ããå¿
èŠããããŸãCGPROGRAM
ã float _Distance;
ããã§äœæ¥ããæºåãã§ããŸãããç
§ææ©èœã倿Žãã
æåã«è¡ãå¿
èŠãããã®ã¯ãCD-ROMã·ã§ãŒããŒã®ã©ã€ãã£ã³ã°æ©èœãç¬èªã®ãã®ã«çœ®ãæããããšã§ãã#pragma
ããã§ãã£ã¬ã¯ãã£ãã倿Žããããšã§ãããè¡ãããšãã§ããŸãã #pragma surface surf Standard fullforwardshadows
ã«ïŒ
#pragma surface surf Diffraction fullforwardshadows
ããã«ãããUnityã¯ãåŒã³åºãã颿°ã«ç
§æèšç®ãå§ä»»ãLightingDiffraction
ãŸãããã®ãµãŒãã§ã¹ã·ã§ãŒããŒã®æ©èœãæ¡åŒµããåå®çŸ©ããªãããšãçè§£ããããšãéèŠã§ãããã®ãããæ°ããç
§ææ©èœã¯ãæšæºã®Unity PBRç
§ææ©èœãåŒã³åºãããšããå§ãŸããŸãã #include "UnityPBSLighting.cginc" inline fixed4 LightingDiffraction(SurfaceOutputStandard s, fixed3 viewDir, UnityGI gi) {
äžèšã®ã³ãŒãã¹ãããããããããããã«ãæ°ãã颿°ã¯LightingDiffraction
åã«LightingStandard
ãã®å€ãåŒã³åºããŠè¿ããŸããããã§ã·ã§ãŒããŒãã³ã³ãã€ã«ãããšããããªã¢ã«ã®ã¬ã³ããªã³ã°æ¹æ³ã«éãã¯èŠãããŸããããã ããå
ã«é²ãåã«ãã°ããŒãã«ã€ã«ãããŒã·ã§ã³ãåŠçããããã®è¿œå ã®é¢æ°ãäœæããå¿
èŠããããŸãããã®åäœã倿Žããå¿
èŠããªããããæ°ããã°ããŒãã«ã©ã€ãã£ã³ã°æ©èœã¯ãæšæºã®Unity PBRæ©èœã®ãããã·æ©èœã«ãããŸããã void LightingDiffraction_GI(SurfaceOutputStandard s, UnityGIInput data, inout UnityGI gi) { LightingStandard_GI(s, data, gi); }
ãŸãLightingStandard
ãçŽæ¥äœ¿çšLightingDiffraction_GI
ãããããã·ã§ãŒããŒã«å«ããå¿
èŠãããããšã«ã泚æããŠãã ããUnityPBSLighting.cginc
ãåææ Œåã®å®è£
ãããã·ã§ãŒããŒã®åºç€ã«ãªããŸããããã§ãåã®ããŒãã§å°åºããåææ Œåæ¹çšåŒãå®è£
ããæºåãæŽããŸããããã®äžã§ã芳枬è
ã¯ãã¹ãŠã®æ³¢é·ã®åèšã§ããè¹è²ã®åå°ãèŠããšããçµè«ã«éããŸããæ Œåæ¹çšåŒãæºããïŒ
ã©ãã§
-ãã倧ããæŽæ° ã
åãã¯ã»ã«ã«ã€ããŠãå€ ïŒå
ã®æ¹åã«ãã£ãŠæ±ºå®ãããŸãïŒãïŒã¬ãã¥ãŒã®æ¹åã«ããæ±ºå®ïŒããã³ïŒã®ã£ããéã®è·é¢ïŒã¯æ¢ç¥ã§ããæªç¥ã®å€æ°ã¯ ãããŠ
ã
æãç°¡åãªæ¹æ³ã¯ãå€ãã«ãŒãããããšã§ã ã©ã®æ³¢é·ãæ Œåæ¹çšåŒãæºãããã確èªããŸããæçµçãªè¹è²åå°ã«å¯äžããæ³¢é·ãããã£ããããããã«å¯Ÿå¿ããè²ãèšç®ããŠè¿œå ããŸãããè¹ã®æ¹åãã»ã¯ã·ã§ã³ã§ã¯ãå¯èŠã¹ãã¯ãã«ã®æ³¢é·ãè²ã«å€æããããã€ãã®æ¹æ³ãæ€èšããŸãããspectral_zucconi6
æå°ã®èšç®ã³ã¹ãã§æè¯ã®è¿äŒŒãæäŸããããããã®ãã¥ãŒããªã¢ã«ã䜿çšããŸããæ¬¡ã®å¯èœãªå®è£
ãèŠãŠã¿ãŸãããã inline fixed4 LightingDiffraction(SurfaceOutputStandard s, fixed3 viewDir, UnityGI gi) { // fixed4 pbr = LightingStandard(s, viewDir, gi); // fixed3 color = 0; for (int n = 1; n <= 8; n++) { float wavelength = abs(sin_thetaL - sin_thetaV) * d / n; color += spectral_zucconi6(wavelength); } color = saturate(color); // pbr.rgb += color; return pbr; }
ãã®ã³ãŒãã¹ããããã§ã¯ãå€ã䜿çšããŸã ããè¯ãçµæãåŸãããã«ããã倧ããªå€ããšãããšãã§ããŸãããããã¯ãã§ã«è¹è²ã®åå°ã®éèŠãªéšåãèæ
®ããã®ã«ååã§ããç§ãã¡ã¯æåŸã®å·Š-èšç®ããsin_thetaL
ãšsin_thetaV
ããããè¡ãã«ã¯ãå¥ã®æŠå¿µãå°å
¥ããå¿
èŠããããŸãïŒæ¥ç·ãã¯ãã«ã§ããæ¬¡ã®ããŒãã§ã¯ããã®èšç®æ¹æ³ãåŠã³ãŸããããŒã7.ã·ã§ãŒããŒCD-ROMïŒåææ Œå-2
ã¯ããã«
ãã¥ãŒããªã¢ã«ã®åã®éšåã§ãCD-ROMã®è¡šé¢ã«çŸããè¹è²ã®åå°ã®æåã®è¿äŒŒãäœæããŸããããã®ã·ã§ãŒããŒã¯ç©ççã«æ£ããããšãèŠããŠããããšãéèŠã§ããå¿
èŠãªåå°ãæ£ããã·ãã¥ã¬ãŒã·ã§ã³ããã«ã¯ãCD-ROMã®ãã¹ãŠã®ãã©ãã¯ãåç¶ã«é
眮ãããŠããããšã確èªããå¿
èŠããããŸããããã«ãããæŸå°ç¶ã®åå°ãäœæãããŸããã¹ãããã®åã
å°åºããã©ãã£ã¹æ¹çšåŒã«ã¯å€§ããªå¶éããããŸãããã¹ãŠã®ã¹ããããåãæ¹åã«é
眮ãããŠããããšãåæãšããŠããŸããããã¯ãå€éšã®æè«ã®éªšæ Œã«ããåœãŠã¯ãŸããŸãããCD-ROMã®è¡šé¢ã®ãã©ãã¯ã¯å圢ã«é
眮ãããŸãããœãªã¥ãŒã·ã§ã³ãæåéãå®è£
ãããšãããªã説åŸåã®ãªãåå°ãåŸãããŸãïŒç»åã®å³åŽïŒããã®åé¡ã解決ããã«ã¯ãCD-ROMã®ã¹ãããã®ããŒã«ã«æ¹åãèæ
®ããå¿
èŠããããŸãããã¹ãŠã®ã¹ãªãããåãæ³ç·æ¹åãæã¡ããã£ã¹ã¯ã®è¡šé¢ã«åçŽã§ãããããæ³ç·ãã¯ãã«ã䜿çšããŠã圹ã«ç«ã¡ãŸãããã¹ãªããã®å±æçãªåãã¯ãæ¥ç·ãã¯ãã«ïŒäžã®ç»åã®å·ŠåŽïŒã䜿çšããŠæ±ºå®ã§ããŸããäžã®å³ã§ã¯ãæ³ç·æ¹å éã§è¡šç€ºãããæ¥ç·ã®æ¹å -èµ€ãæ³ç·ã®æ¹åã§åœ¢æãããå
æºãšèгå¯è
ã®è§åºŠ ãšåŒã°ããŠããŸã ãããŠ
ã
ã«äŒŒãè§åºŠ ããã§ãã
ãããŠ
ã
äžèšã®ããã«ãèšç®ã§äœ¿çšãããå Žå ãããŠ
ãã¹ãŠã®ã¹ãªãããåãã§ãããããããã©ãããªãåå°ãåŸãããŸã ã
äœ¿çšæ¹æ³ãèŠã€ããå¿
èŠããããŸã ãããŠ
ãããŒã«ã«æ¹åã«æ£ãã察å¿ããŠããããã§ãããããŸã§ã®ãšãããæ¬¡ã®ããšãããã£ãŠããŸãã
以æ¥
ãããŠ
åçŽã§ããå Žåãæ¬¡ã®ããããã£ããããŸãã
Cgã¯ã¹ã«ã©ãŒç©ã®ãã€ãã£ãå®è£
ãæäŸããããããããéåžžã«äŸ¿å©ã§ããèšç®ããã ãã§ã ã
ã³ãµã€ã³ã¯ã©ãããæ¥ãã®ã§ããïŒ: 1. . , â .
, . , . .
æ¥ç·ãã¯ãã«ã®èšç®
ã·ã§ãŒããŒãçµäºããã«ã¯ãæ¥ç·ãã¯ãã«ãèšç®ããå¿
èŠããããŸã ã
éåžžãã¡ãã·ã¥ã®äžéšã«çŽæ¥è¡šç€ºãããŸãããã ããCD-ROMã®è¡šé¢ãã©ãã»ã©åçŽããèæ
®ããŠãèªåã§èšç®ããããšãã§ããŸãããã®ãã¥ãŒããªã¢ã«ã«ç€ºãããŠããã¢ãããŒãã¯éåžžã«åçŽã§ãããCD-ROMã¡ãã·ã¥ã®è¡šé¢ã«æ£ããUVã¹ãã£ã³ãããå Žåã«ã®ã¿æ©èœããããšãèæ
®ãã䟡å€ããããŸãã
äžã®å³ã¯ãæ¥ç·ã®æ¹åãã©ã®ããã«èšç®ããããã瀺ããŠããŸãããã£ã¹ã¯ã®è¡šé¢ã¯ã座æšãïŒ0,0ïŒããïŒ1,1ïŒã®ç¯å²ã®åè§åœ¢ãšããŠUVçŸåããããšæ³å®ãããŸãããããç¥ã£ãŠãCD-ROMã®è¡šé¢äžã®åãã€ã³ãã®åº§æšãïŒ-1ã-1ïŒããïŒ+1ã+ 1ïŒã®ç¯å²ã§åå²ãåœãŠããŸãããã®åçãåºç€ãšããŠãç¹ã®æ°ãã座æšã¯äžå¿ããå€åŽã®æ¹åã«ã察å¿ããŠããããšãããããŸãïŒç·ã®ç¢å°ïŒããã®æ¹åã90床å転ããŠãCD-ROMã®åå¿åç¶ã®ãã©ãã¯ïŒèµ€ã§è¡šç€ºïŒã«æ¥ãããã¯ãã«ãèŠã€ããããšãã§ããŸããsurf
UV座æšã¯ã©ã€ãã£ã³ã°é¢æ°ã§ã¯äœ¿çšã§ããªãããããããã®æäœã¯ã·ã§ãŒããŒé¢æ°ã§å®è¡ããå¿
èŠããããŸãLightingDiffraction
ã // IN.uv_MainTex: [ 0, +1] // uv: [-1, +1] fixed2 uv = IN.uv_MainTex * 2 -1; fixed2 uv_orthogonal = normalize(uv); fixed3 uv_tangent = fixed3(-uv_orthogonal.y, 0, uv_orthogonal.x);
èšç®ãããæ¥ç·ããªããžã§ã¯ãã®ç©ºéããã¯ãŒã«ã空éã«å€æããã ãã§ãã倿ã§ã¯ããªããžã§ã¯ãã®äœçœ®ãå転ãã¹ã±ãŒã«ãèæ
®ãããŸãã worldTangent = normalize( mul(unity_ObjectToWorld, float4(uv_tangent, 0)) )
æ¥ç·æ¹åãã©ã€ãã£ã³ã°é¢æ°ã«è»¢éããæ¹æ³ã¯ïŒLightingDiffraction
. worldTangent, surf
. , , .
, : . . worldTangent
, surf
LightingDiffraction
.
座æšç©ºéãåãæ¿ããæ¹æ³ã¯ïŒ. . .
, . , , , , unity_ObjectToWorld
. Unity, _Object2World
.
ãã¹ãŠããŸãšãã
ããã§ãè¹è²ã®åå°ã«å¯Ÿããè²ã®å¹æãèšç®ããããã«å¿
èŠãªãã¹ãŠãã§ããŸããã inline fixed4 LightingDiffraction(SurfaceOutputStandard s, fixed3 viewDir, UnityGI gi) { // fixed4 pbr = LightingStandard(s, viewDir, gi); // --- --- float3 L = gi.light.dir; float3 V = viewDir; float3 T = worldTangent; float d = _Distance; float cos_ThetaL = dot(L, T); float cos_ThetaV = dot(V, T); float u = abs(cos_ThetaL - cos_ThetaV); if (u == 0) return pbr; // fixed3 color = 0; for (int n = 1; n <= 8; n++) { float wavelength = u * d / n; color += spectral_zucconi6(wavelength); } color = saturate(color); // pbr.rgb += color; return pbr; }
ããã¯è¹ãšã©ã®ããã«é¢ä¿ããŠããŸããïŒwavelength
, for, , .
( 400 700 ) . , .
« » , . , ,
spectral_zucconi6
. ,
GPU Gems .