12æã«éå¬ãããHolyJSäŒè°ã§ã圌ã¯GLSLã䜿çšããŠãéåžžã®JavaScriptããšæ¯èŒããŠUIã³ã³ããŒãã³ãã®äœæ¥ãæ¹åããæ¹æ³ã«ã€ããŠãã¬ãŒã³ããŒã·ã§ã³ãè¡ããŸããã ãããŠä»ãHabrã®ããã«ãã®ã¬ããŒãã®ããã¹ãçãæºåããŸãã-ããããkatïŒ åæã«ãã¹ããŒãã®ãããªãæ·»ä»ããŸãã
ãããããèŠèŽè ãžã®è³ªåã§ããWebã§ã¯ããã€ã®èšèªããµããŒããããŠããŸããïŒ ïŒèŽè¡ããã®å£°ïŒãåäžã§ã¯ãªãïŒãïŒ
ããŠããã©ãŠã¶ã®èšèªã¯ãããèšã£ãŠã¿ãŸãããã äžïŒ HTMLãCSSãJSãSVGã®4ã€ããããšããŸãã SVGã¯å®£èšåèšèªãšèŠãªãããšãã§ããŸãããããã¯å¥ã®çš®é¡ã§ãããHTMLã§ã¯ãããŸããã
ããããå®éã«ã¯ããã«å€ããããŸãã VRMLãããã圌ã¯æ»ã«ãŸãããããªãã¯ãããæ°ããããšãã§ããŸããã GLSLïŒãOpenGLã·ã§ãŒãã£ã³ã°èšèªãïŒããããŸãã ãŸããGLSLã¯Webçšã®éåžžã«ç¹æ®ãªèšèªã§ãã
æ®ãïŒJSãCSSãHTMLïŒã¯Webäžã§çºçããWebããŒãžããä»ã®ãã©ãããã©ãŒã ïŒã¢ãã€ã«ãªã©ïŒã§åå©ã®è¡é²ãå§ãŸã£ãããã§ãã ãããŠãGLSLã¯ã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ã¹ã®äžçãC ++ã§çãŸãããããããŠã§ãã«æ¥ãŸããã ãããŠãããã®çŽ æŽããããšããïŒOpenGLãåäœããå Žæãªãã©ãã§ãåäœããã®ã§ãåŠãã ãªãã©ãã§ãïŒUnityãSwiftãJavaãªã©ã§ïŒäœ¿çšã§ããŸãã
GLSLã¯ãã³ã³ãã¥ãŒã¿ãŒã²ãŒã ã®ã¯ã¬ã€ãžãŒãªç¹æ®å¹æã®èåŸã«ãããŸãã ãããŠãç§ã¯ãã®å©ããåããŠãé¢çœããŠçããUIã³ã³ããŒãã³ããéçºããããšãã§ããŸãããããã«ã€ããŠã¯åŸã§èª¬æããŸãã ãŸãã䞊åã³ã³ãã¥ãŒãã£ã³ã°ã®ãã¯ãããžãŒã§ããããããGLSLã䜿çšããŠæå·é貚ããã€ãã³ã°ã§ããŸãã äœã«èå³ããããŸããïŒ
ç©èª
GLSLã®æŽå²ããå§ããŸãããã ãã€ããªã圌ã¯çŸããŸãããïŒ æ¬¡ã®å³ã¯ãOpenGLã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã瀺ããŠããŸãã
æåã«ãOpenGLã®æåã®ããŒãžã§ã³ã§ã¯ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã¯æ¬¡ã®ããã«ãªããŸããïŒé ç¹ãå ¥åã«äŸçµŠãããããªããã£ããé ç¹ããåéãããããªããã£ããã©ã¹ã¿ã©ã€ãºããããã¬ãŒã ãããªãã³ã°ããããã¬ãŒã ãããã¡ãŒãåºåãããŸãã
ããã«åé¡ããããŸãïŒã«ã¹ã¿ãã€ãºã§ããŸããã ãã€ãã©ã€ã³ãæ確ã«å®çŸ©ãããŠãããããããã«ãã¯ã¹ãã£ãã¢ããããŒãã§ããŸãããæ£ç¢ºãªãªã¯ãšã¹ãã«å¯ŸããŠç¹å¥ãªããšã¯ã§ããŸããã
æãåçŽãªäŸãèŠãŠã¿ãŸãããïŒé§ãæããŸãã ã·ãŒã³ããããŸãã ããã¯ãã¹ãŠé ç¹ã§æ§æããããã¯ã¹ãã£ãéããããŠããŸãã OpenGLã®æåã®ããŒãžã§ã³ã§ã¯ã次ã®ããã«ãªããŸããã
é§ã¯ã©ã®ããã«äœãããŸããïŒ ãã©ã°ããªã¥ãŒã®åŒã§ã¯ãããã¯ã«ã¡ã©ãŸã§ã®è·é¢ã«ãã©ã°ã®å¯åºŠãæãããã®ã§ããã¯ã»ã«ã®è²ã¯çŸåšã®ãã¯ã»ã«ã®è²ã«ãã©ã°ã®è²ãšãã©ã°ã®éãæãããã®ã«çãããªããŸãã ç»é¢äžã®åãã¯ã»ã«ã«å¯ŸããŠãã®æäœãå®è¡ãããšã次ã®çµæãåŸãããŸãã
GLSLã·ã§ãŒããŒã¯ã2004幎ã«OpenGL v2ã«ââç»å ŽãããããOpenGLã®æŽå²ã®äžã§æ倧ã®ãã¬ãŒã¯ã¹ã«ãŒã§ããã 1991幎ã«ç»å Žãã13幎åŸã®ä»ã次ã®ããŒãžã§ã³ããªãªãŒã¹ãããŸããã
ãã以éããã€ãã©ã€ã³ã¬ã³ããªã³ã°ã¯æ¬¡ã®ããã«ãªãå§ããŸããã
é ç¹ãå ¥åã«äŸçµŠãããé ç¹ã·ã§ãŒããŒãæåã«å®è¡ããããªããžã§ã¯ãã®ãžãªã¡ããªãå€æŽã§ããããã«ãªãã次ã«ããªããã£ããæ§ç¯ãããã©ã¹ã¿ã©ã€ãºããããã©ã°ã¡ã³ãã·ã§ãŒããŒãå®è¡ãããŸãïŒãfragmentãã¯ããã¯ã»ã«ããæå³ããŸããããªãã³ã°ããŠè¡šç€ºããŸãã
ããŠãGLSLã®æ©èœã®ããã€ãã«ã€ããŠã話ãããŸãããããªããªããJSéçºè ã«ãšã£ãŠã¯ãéåžžã«å€ãã®ãç°åžžã§å¥åŠã«èãããèŠçŽ ãéåžžã«å€ãããã§ãã
ãŸããWebéçºè ã«ãšã£ãŠç§ãã¡ã«ãšã£ãŠéèŠãªããšã¯ãGLSLã¯WebGLä»æ§ã®äžéšã§ãã GLSLãžã®ã²ãŒããŠã§ã€ã¯<canvas />ã§ãã
GLSLã¯GPUãã©ã€ããŒã䜿çšããŠã³ã³ãã€ã«ãããŸãã ããã«ãããç¹å®ã®ãã©ãããã©ãŒã ããšã«ã³ã³ãã€ã«ããããããã¯ãã¹ãã©ãããã©ãŒã ã§ãããé©ãã»ã©é«éã§ãã ãã©ãããã©ãŒã çšã«ç¹å¥ã«ã³ã³ãã€ã«ãããæå³ãããç¹å¥ãªããŒããŠã§ã¢äžã§å®è¡ããããããJavaScriptãããæ°ååé«éã§ãã
åæã«ãã«ãŒããªã©ã®å€ãã®ããã»ã¹ã§èµ·åããŸããããŒããŠã§ã¢ã®ãã¥ãŒã¹ã§ããGTX 970ã«ãŒãã«åŸããšãåæã«1664ã·ã§ãŒããŒããã»ã¹ãå®è¡ããŸãã ããªããã©ãã ãèªåã®ããšãã§ãããæ³åããŠã¿ãŠãã ããïŒ
äžè¬çã«ãããããã€ãã³ã°ã®å®è¡æ¹æ³ã§ãããä»ã®ãã¹ãŠããã¹ãŠã®äžŠåã³ã³ãã¥ãŒãã£ã³ã°-ãããã¯CUDAãã©ãããã©ãŒã ã§ãããã·ã§ãŒããŒãä»ããŠæ©èœããŸãã ãããã¯åžžã«GLSLã§ãããšã¯éããŸããããWebã«ã¯OpenGLä»æ§ã®äžéšã§ããGLSLã·ã§ãŒããŒããããŸãã
ããŒã¿ãäžåºŠã ãéä¿¡ããããšããäºå®ã«é¢é£ããç¹å®ã®æ©èœããããŸãã å®è¡ã¯ãããã»ãŒãžå šäœãç»é¢å šäœã«å¯ŸããŠäžŠè¡ã§ãããããããŒã¿ã¯ã·ã§ãŒããŒã«äžåºŠããŒãããããããèæ ®ããå¿ èŠããããŸãã
GLSLã¯åŒ·ãåä»ããããèšèªã§ãã ã¿ã€ãã¯floatãintegerãbooleanã2-3-4ã³ã³ããŒãã³ããã¯ãã«ïŒå®éã«ã¯2-3-4-elementé åã§ãïŒã2-3-4次å ã®è¡åããããŸãã
ããã¯æ°åŠã®ããã«ç ãæŸãŸãããèšèªã§ãããæ³åã§ãããã¹ãŠã®çŽ æŽãããäžè§é¢æ°ãšæ°åŠé¢æ°ãæã£ãŠããŸãïŒã©ãžã¢ã³ãã床ãã©ãžã¢ã³ãã床ããµã€ã³ãã¢ãŒã¯ã³ãµã€ã³ãã¿ã³ãžã§ã³ããè¡åä¹ç®ããã¯ãã«ä¹ç®ãããŸããŸãªåŸ®åãªã©ã
ç·Žç¿ãã
ããã çè«ãããå®è·µã«ç§»ããŸãããã æãåçŽãªãã¯ã»ã«ã·ã§ãŒããŒãæ€èšããŠãã ããã
æåã«åã®ååŸãèšå®ããŸããããã¯floatåã®å€æ°ã§ãã ãã®å Žåãäžå¿ã¯2æåã®ãã¯ãã«ã«ãªããŸãã GLSLã®åç¹ã¯å·Šäžé ã§ã¯ãªããå·Šäžé ã«ããããšã«æ³šæããŠãã ããã 座æšãå°ãåãããŠããã®åãã©ããã«ç§»åã§ããŸãã
次ã«äž»ãªæ©èœããããŸããããã¯ã·ã§ãŒããŒãžã®ãšã³ããªãã€ã³ãã§ãã ãŸããçµã¿èŸŒã¿ã®è·é¢é¢æ°ãçŸåšã®ãã¯ã»ã«ã®åº§æšãããã³äžå¿ã®åº§æšã䜿çšããŠãäžå¿ãŸã§ã®è·é¢ãèšç®ããŸãã
次ã«ãinCircle floatå€æ°ãèšç®ãããŸãããã¯ã»ã«ãåã®å åŽã«ããå Žåã¯1ã«çãããå€åŽã«ããå Žåã¯ãŒãã«ãªããŸãã
æåŸã®æäœã¯ãç»é¢ã«è¡šç€ºãããè²ã決å®ããåºåãã©ã¡ãŒã¿ãŒgl_FragColorã§ãã åè¿°ã®inCircleãå²ãåœãŠãŸãã ã€ãŸããåã®å åŽã«ãããšã1ã€ã«ãªããŸãã
ããã¯éåžžã«èå³æ·±ãç¥èšã§ãã1ã€ã®floatå€æ°ãã4ã³ã³ããŒãã³ãã®ãã¯ãã«ãäœæããããã¯ãã«ã®ãã¹ãŠã®ã³ã³ããŒãã³ãã«ãã®å€æ°ã®å€ãããã«å²ãåœãŠãããŸãã RGBAè¡šèšã䜿çšããŸããã€ãŸãã4ã€ã®ã³ã³ããŒãã³ãã¯RGBãšã¢ã«ãã¡ãã£ãã«ã§ãã
ãããŠã次ã®ããã«å€æŽã§ããŸãã
ããã§äœãèµ·ãã£ãŠããŸããïŒ çµæã®å€ããã¹ãŠã®ãã£ã³ãã«ã«äžåºŠã«å²ãåœãŠãã®ã§ã¯ãªããç·ã«ã®ââã¿å²ãåœãŠãŸãã
ããŠãã»ãšãã©åœ¹ã«ç«ããªãæãåçŽãªäŸãããå®çšçãªåé¡ã解決ããããšã«ç§»ããŸãããã ã¢ã ã¹ãã«ãã ã®ç§ã®æ²ããæãç§ã¯JIRAã§ä»äºãåŸãŠã人çãå°ã楜ãããªããŸããã
ã¿ã¹ã¯ã¯ã¹ãããŒã«é¢ãããã®ã§ããã ç§ãã¡ã¯JSã§ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãèšè¿°ããŸããããOSã«ã¯ãã®ãããªã¯ãŒã«ãªã¹ãããŒããããŸããã ããã¯æ©èœããŸãããã1ã€ã®å°ããªåé¡ããããŸãããããçš®ã®ããã¯ã°ã©ãŠã³ãããã»ã¹ããããšããã¹ãããŒãæã ã²ãã€ããŸããã ç§ã¯ãããæŽçããããã«é ŒãŸããŸããã
æãå§ãããšãããã¹ãããŒãã¹ãã©ã€ãã·ãŒãã䜿çšããŠå®è£ ãããŠããããšãããããŸãããèŠçŽ ã®èæ¯ã®äœçœ®ãå€ãããããããã¹ãŠã®ãã¬ãŒã ãã¹ã¯ããŒã«ããŸãã
åºæ¬çã«ã¯æ©èœããŸãããããããããããã¯ã°ã©ãŠã³ãã®äœçœ®ãå€æŽãããå Žåãäœãèµ·ãããç¥ã£ãŠããŸããïŒ å¡ãçŽããŸãã 絶ãéãªããªããã³ã°ããããããã«ããããã»ããµãããŒããããéåžžã«é«éã«åäœããŸããã§ããã
ããã¯ã©ã®ããã«ä¿®æ£ã§ããŸããïŒ CSSãä»ããŠå¯èœã§ãã åœç¶ãç§ã¯ããã«GLSLã®ãžã£ã³ã°ã«ã«å ¥ããŸããã§ãããæåã¯ãCSSãããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ããããã£ãéããŠãæãç°¡åãªæ¹æ³ã§ãã¹ãŠãè¡ããŸããã ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã®ããããã£ãããããšãå€ãã®äººãç¥ã£ãŠããŸãããããã®ããããã£ã䜿çšãããšãäœããã®ã¢ãã¡ãŒã·ã§ã³ãå®è¡ã§ããŸãã ããã§ã¯ãããããã¹ãŠãäžéæ床ã«å€æŽã§ããŸããã€ãŸããèæ¯ã®äœçœ®ããäžéæ床ã«å€æŽã§ããŸãã
ãããäžéæ床ã§ã©ã®ããã«è¡ãããšãã§ããŸããïŒ ãã¹ãŠã®ãã¬ãŒã ãã¬ã€ã€ãŒã«å解ããäžéæ床ã®å©ããåããŠåŸã ã«ãã¬ãŒã ãé衚瀺ã«ããŠè¡šç€ºãããšãäžè¬ã«åãå¹æãåŸãããŸãããåçã¯è¡ãããŸããã HoorayãQAéšéã¯ããã©ãŒãã³ã¹ã®åäžã確èªãã誰ãã幞ãã§ãã
ç¿æ¥ãJIRAã§å¥ã®ã¿ã¹ã¯ãåãåããŸããã ããã¹ãããªãã¯ãã§ã«ã¹ãããŒã®å°é家ã§ããããšãç¥ã£ãŠããŸããã¹ãããŒã¯ãŸã£ããåãã§ãéãšå¹ ããããã«ç°ãªããŸãã
ã¹ãããŒãããããããããšã¯ç¥ã£ãŠããŸããããå°ããªåé¡ãããããšã«æ°ä»ããŸããã ãŸãããããªã¡ã¢ãªã®150ãã¬ãŒã ã®ãã®ã¹ãããŒã¯ã8ãã©ã¹ã¡ã¬ãã€ãã§å±éãããŸãããããã®ãã¯ã¹ãã£ã®è§£å床ãšãããæ°ã«ãã£ãŠå ·äœçã«èšç®ããŸãïŒåãã¬ãŒã ã«ãã¯ã¹ãã£ãäœæãããããã§ãã 100ãããã€ããããŠã³ããŒãããŸããäžè¬ã«ãåã¹ãããŒã¯è§£åããå¿ èŠãããããšãèæ ®ãããšãçŽ20ã30ã¡ã¬ãã€ãããããŸããã¹ãããŒã®å Žåã30ã¡ã¬ãã€ãã¯ãå€ãã®å Žåã§ãã
ãã©ãŠã¶ã«ã¯256ã¡ã¬ãã€ãã®å¶éããããŸããããããã«å°éãããšããã«ãã·ã¹ãã å šäœã厩å£ããŸããã æºåž¯é»è©±ã§ã¯ãã¹ãããŒããšã«100ã¡ã¬ãã€ãã蚱容ã§ããªãèŽ æ²¢ã ãšæããŸãã
ããããŸãããåé¡ããããŸãã GLSLã䜿çšããŠè§£æ±ºã§ããŸãã ãããã©ãã»ã©å®çšçãã«ã€ããŠã¯ãåŸã§èª¬æããŸãã
ã·ã§ãŒããŒãæžã
ããã§ããã¯ã»ã«ã·ã§ãŒããŒãäžç·ã«äœæã§ããŸãã ã¹ãããŒã¯ãã¢ãã¡ãŒã·ã§ã³ã¢ãŒãã®åœ¢ã§è¡šãããšãã§ããŸãããã®ã¢ãŒãã¯ãéãããéãããããããšã§éããŸããéå§ãšçµäºã®è§åºŠãå€æŽãããã®ã¢ãŒãã¯äžå®ã®åšææ§ãæžè¡°ãå éã§å転ããŸãã ãããã£ãŠãGLSLã§æ°åŠã䜿çšããŠã¢ãŒããæãæ¹æ³ãåŠã¶å¿ èŠããããŸãã
ãŸããChrome Refined GitHubã®æ¡åŒµæ©èœãã€ã³ã¹ããŒã«ããŸããã³ãããããå·®åãã³ããŒããå¿ èŠããããŸãã é 眮ããªãå Žåãå·®åããã¹ããã³ããŒããããšãããšãè¡çªå·ãã³ããŒããããããæåã§åé€ããå¿ èŠããããŸãã ãããã£ãŠãæŽç·ŽãããGithubã¯è¡çªå·ãå¥ã®ãªã¹ãã«å ¥ããŠãããã®ã§ããšãŠã圹ç«ã¡ãŸãã
次ã«ã ãªã³ã©ã€ã³ã·ã§ãŒããŒãšãã£ã¿ãŒãšPixelsCommander / pixel-shaders-workshop GitHubãªããžããªãéããŸããããã§æé ãå®è¡ããå¿ èŠããããŸãã
ã©ãããå§ããŸããïŒGLSLãšãã£ã¿ãŒã®æåã®ã¹ããããã³ããŒããŠè²Œãä»ããŠãã ããã
ããã§äœãèµ·ãã£ãŠããŸããïŒ æ°ãããããã¯ã®æäžéšã«ã¯ãåã®äŸã«ã¯ãããŸããã§ããããããã«ã¯çµ±äžå€æ°ããããŸãã ãåäžããšã¯ãJavaScriptããéä¿¡ãããå€æ°ãæå³ããŸãã JavaScriptã®u_timeãu_resolutionãããã³u_mouseã衚瀺ãããŸãã æãèå³æ·±ãã®ã¯u_resolutionã§ãã 圌女ãèšãããšã¯ããã£ã³ãã¹ã®æ¬¡å ã§ãã JavaScriptã¯ãã£ã³ãã¹ãã£ã¡ã³ã·ã§ã³ãååŸããGLSLã®2ã³ã³ããŒãã³ããã¯ãã«ãéä¿¡ããŸãããããã§ãGLSLã®ãã£ã³ãã¹ãµã€ãºãããããŸããã
PIã§ã¯ãæã§åžžã«æžããªãããã«piã決å®ããŸããã 次ã«ãu_resolutionã«0.5ãä¹ç®ããŸãããããã¯2ã³ã³ããŒãã³ããã¯ãã«ïŒå¹ ãšé«ãããããŸãïŒã§ããã¯ãã«ã«0.5ãæãããšããã®ãã¹ãŠã®ã³ã³ããŒãã³ãã«äžåºŠã«0.5ãæããããŸãã ãã®ããããã£ã¡ã³ã·ã§ã³ã®ååãèŠã€ãããŸããã ãã®åŸã圌ãã¯å¹ ãšé«ãã®æå°å€ãšããŠååŸãåããŸããã
ããã§Circleé¢æ°ãã§ããŸãããå ã»ã©ããµãŒã¯ã«å ã«ãããã©ãããã¡ã€ã³ã§å®çŸ©ããçŸåšã®ãã¯ã»ã«ãäžå¿ãååŸã®åº§æšãèµ·åããå¥ã®é¢æ°ã«ç§»åããŸããã
ãããŠãäž»ã«ãCircleé¢æ°ãå®è¡ããçµæãšããŠisFilledãååŸãããŠãããããisFilledãæžç®ããŸããããã¯ãèæ¯ãçœã«ããªãããã«ããããã§ãã ã€ãŸãã圌ãã¯ãã®å¯ããã¹ãŠé転ãããŸããã
次ã®ã¹ããã ïŒåã®ã»ã¯ã¿ãŒãåãåããŸãã
æ圢ãæãé¢æ°ãšãè§åºŠã2ã€ã®äžããããè§åºŠã®éã«ãããã©ããã瀺ãé¢æ°ãè¿œå ããŸãã ããã«ãisFilledã¯ãµãŒã¯ã«ãšã»ã¯ã¿ãŒã®çµæã®ç©ã«ãªããŸããã ã©ã¡ãã®å Žåã1ã€ã§ããã°ãå³ã®ç¯å²å ã«ããŸãã åãèæ ®ãããªãå Žåãã»ã¯ã¿ãŒã¯ç¡éã«ãªããåã«éå®ãããŸããã çµæã¯æ¬¡ã®ããã«ãªããŸãã
ããŠã 3çªç®ã®ã¹ããã ã ã¢ãŒããæããŸãã
æ°ããã¢ãŒãæ©èœãããã«è¿œå ãããŸãã 次ã«ããã®åããç¥ãå¿ èŠããããŸããããã®ããã«ãå éšååŸãèšç®ããäœãèŠããã®ã§ããããïŒ
ããã§isFilledãã§ããŸãã-ããã¯arcé¢æ°ãå®è¡ããçµæã§ãéå§è§åºŠãçµäºè§åºŠãå åŽååŸãšå€åŽååŸãæž¡ããŸãã ããã§ã¯ãããã¯ãã¹ãŠãç§ãã¡ããã§ã«æã£ãŠããã»ã¯ã¿ãŒãšãäºãã«å転ããåã®2ã€ã®é¢æ°ã«åºã¥ããŠå éšçã«æ§ç¯ãããŸãã ã€ãŸãã2ã€ã®åãåãåãããäžæ¹ãä»æ¹ãé衚瀺ã«ããŸãã
ãã¹ãŠãçŽ æŽãããããã¹ãŠãçŽ æŽããããã¢ãŒãããããã»ãŒæºåãã§ããŠããŸãããããèŠããšããªããå©ããããšãããšãã¢ãŒãããã¯ã»ã«åãããŠããããšã«æ°ã¥ãã§ããããã¹ã ãŒãžã³ã°ãªãã®ãã¯ããŒããããããŸãïŒ
ããã¯ãã¹ã ãŒãžã³ã°ããªãããã§ããããã¯ãåãæããšãã«ãããã§ã¹ãããé¢æ°ã䜿çšãããã€ã³ããåå ã«ãããã©ãããå€æããå€ãå°ããå Žåãã¹ãããé¢æ°ãé¢æ£çã«0ãŸãã¯1ã匷å¶çã«é®æããããã§ãäžããããå Žåãããã¯0ã§ããã°ã1ã§ãããããã£ãŠããã¯ã»ã«ã¯é»ã§ãçœã§ãããŸããŸããã
ãããåãé€ããŸããããããã¯ã¹ããã4ã«ãªããŸããã¢ã³ããšã€ãªã¢ã¹ãè¿œå ããŸãã
stepé¢æ°ãsmoothstepã«çœ®ãæããŠããŸãã ãŸããsmoothstepã¯ã0ãŸãã¯1ãã®ã©ã¡ããã ãã§ã¯ãªãã2ã€ã®å€ã®éãè£éããŸãã ããã«ã¯ãdistanceToCenter-2ãã¯ã»ã«ãããããdistanceToCenterã ãããããŸããã€ãŸãã2ãã¯ã»ã«ã®ã¹ãã¢ãªã³ã°ã«ããã¢ã³ããšã€ãªã¢ã¹ããããŸãã ããã§çšèªã«ã€ããŠè°è«ããããšãã§ããŸãããå®éã«ã¯ã·ã§ãŒããŒã«ã¢ã³ããšã€ãªã¢ã¹ãè¿œå ããŸããã
ãããŠãã¢ãŒãã¯æ»ããã§çµ¹ã®ããã«ãªããŸããã
ããã§ã¯ãæãå°é£ãªã¢ãã¡ãŒã·ã§ã³ã«ç§»ããŸãããã äžè¬ã«ãã¢ãŒããæãããšã¯5幎çã®äžè§æ³ã§ãããè€éãªããšã¯äœããããŸããã ã¢ãã¡ãŒã·ã§ã³ã§ã¯ãæåã«èªèããŠå解ããå¿ èŠããããããç©äºã¯ããå°ãè€éã§ãã
ã¹ãããŒã¢ãã¡ãŒã·ã§ã³ãå解ãããšãå®éã«ã¯2ã€ã®ã¢ãã¡ãŒã·ã§ã³ãããããšãããããŸãã 1ã€ã¯æãããã¿ã®ãããã¯è§£é€ã¢ãã¡ãŒã·ã§ã³ã§ã2ã€ç®ã¯å転ã¢ãã¡ãŒã·ã§ã³ã§ãã ããã«ãã«ãŒãã®éå§æã«ã¢ãã¡ãŒã·ã§ã³ã®é床ãäžãããçµããã«é ããªããŸãã ããã¯ãæ£åŒŠé¢æ°ã®åäœã«éåžžã«äŒŒãŠããŸãã-pi / 2ããpi / 2ã®åºéã§ã¯ãæåã«å éãå§ãŸããæ¥æ¿ã«äžæãããã®åŸæžéããŸãã
ã¹ããã5 ãã®é¢æ°ãã¢ãŒãã®å§ç¹ãšçµç¹ã®è§ã«é©çšããŸãã ãã°ããã®éã¯å°ãç«æŽŸã§ããïŒããã¯ä¿®æ£ãããŸãïŒãcollapse-unblockã®ã¢ãã¡ãŒã·ã§ã³ãååŸããŸãã ããã§äœãèµ·ãã£ãŠããŸããïŒ æéã¯-pi / 2ããpi / 2ã®æéã§çµäºãããµã€ã³é¢æ°ãããã«é©çšããã0ãã1ã®å€ãååŸãããã³ã«ãã©ãã ãæããããŸããããäžå¹žã§ãã ã€ãŸããå®éã«ã¯ãããã§ã€ãŒãžã³ã°é¢æ°ã䜿çšãããŸããããã¯ãååã®ã©ãã§ã§ã䜿çšããããã®ã§ããCSSã§ã¯ãããã§GLSLã«å®è£ ãããŸãã 次ã«ããã®ã€ãŒãžã³ã°é¢æ°ã®çµæã«360ãæããŠãéå§è§åºŠãã€ãŸãçµäºè§åºŠãååŸããŸããããã¯ãåã«äœæããarché¢æ°ã«æž¡ããŸãã
次ã®ã¹ãããã¯ãã¹ãããŒå šäœã®å転ã§ãã
å転ã¯ãã¹ãŠåçŽã§ããã§ã«çè«çãªããŒã¹ãæºåããŠããŸãããµã€ã³ãé§åããstartAngleãšendAngleã«ãµã€ã³ããååŸããå€ãè¿œå ããŠããŸããã2åã®åšæãããã®ã§åŽ©å£ããã厩å£ãããããã¯ãã£ã1ã€ã®é©åœã§ããããšãå€æããã
ãã®ããã«ãç§ãã¡ã¯ã¹ãããŒãæã«å ¥ããŸãããããã¯ãã§ã«æè¡çãªã¿ã¹ã¯ã«ã»ãŒå¯Ÿå¿ããŠããŸãã å°ããã©ã¡ãŒã¿ãŒåãè¿œå ããŸãã
ãããè¡ãã«ã¯ãRGBé¢æ°ãå¿ èŠã§ãã 䜿çšããå¿ èŠã¯ãããŸããããéåžžã¯Photoshopããè²ãååŸãã0ã255ã®ãã£ãã«ãã€ãå€ãæã£ãŠããããã0ã1ã®GLSLã§ãããèŠãããšãã§ããŸãã 255/255/255ã«éŠŽæã¿ãåºåã§1/1/1ãååŸããŸãã
ã¡ã€ã³ã§ãã®é¢æ°ã䜿çšããŸãããŸããç«çœã®å Žåã«åããŠãèæ¯ã®ã«ã¹ã¿ãã€ãºãè¿œå ãããŠããŸãã
å¹ ãšè²ãå€æŽã§ããçŽ æŽããããã¯ã¿ãŒã¹ãããŒãå€æããŸããã ã³ã³ããŒãã³ãã¯æºåãã§ããŠãããåäœããGPUã§ã¬ã³ããªã³ã°ãããŸãããã®ãã¹ãŠã«70è¡ã®ã³ãŒããå¿ èŠã§ãã äŒæ¯ããå Žåã¯ãããããæ倧5è¡ãŸã§çµãããšãã§ããŸãããã¡ãããããã¯ãã¹ãã©ã€ãã·ãŒãã§éä¿¡ããæ å ±ã®éãšæ¯èŒããããšã¯ã§ããŸãã-ã¡ããã©å€©ãšå°ã§ãã åçã ãã§30ã¡ã¬ãã€ããããå Žåãããã«ãã¯ã¹ãã£ãªã©ã«åãã³ã³ããã¹ããåæåããå¿ èŠãããå Žåã¯ãæãããªé²æ©ããããŸãã
ç§ãã¡ã¯ããã«ã€ããŠäœãã§ããŸãã
Webã¢ããªã±ãŒã·ã§ã³ã§GLSLã³ã³ããŒãã³ãã䜿çšããæ¹æ³ã¯ïŒ æ¢ã«è¿°ã¹ãããã«ãããã¯WebGLã³ã³ããã¹ããä»ããŠè¡ãããŸãã
ç°¡åãªæ¹æ³ããããŸãã GLSLã³ã³ããŒãã³ããšåŒã°ããWebã³ã³ããŒãã³ããããããããããŒãžã®é©åãªå Žæã«é 眮ããŸãããã®ã¿ã°ã¯ããšãã£ã¿ãŒã§ååŸããGLSLã³ãŒããå éšã«é 眮ããŸãã ãããŠãããªãã¯ãã®ãããã¯ãæã£ãŠãããµã€ãºã§åãåããŸããããªãã¯ãªã³ã©ã€ã³ã§åäœããGLSLã³ã³ããŒãã³ããåãåããŸãã
以åã¯ãCSSãã¹ãã©ã€ãã·ãŒãããã®ä»ã®ããªãã¯ãäžæ°ã«ã¹ãã¬ããããããšã§äœãã§ããããå®è£ ããŸããããåžžã«é«éã§ã¯ãããŸããã§ããã ããããå®éã«ã¯ãã·ã§ãŒããŒã¯ã¯ããã«ã¯ãŒã«ã§ãããã¹ãŠã®ãã¯ã»ã«ãå¶åŸ¡ã§ããŸãã
ã«ãŒãœã«ã«å¿çããã¹ãããŒã瀺ãgifã¯æ¬¡ã®ãšããã§ãã
ãŸãããããªã§ã¯ã GLSLãäžåè¡¡ã«å€ãã®æ©èœãæäŸããåãã¯ã»ã«ãå¶åŸ¡ã§ããæ¹æ³ã®ããã«å°è±¡çãªäŸãèŠãããšãã§ããŸãã ããã§ãã¹ãããŒã¯ãã§ã«å¥ã®ãã®ã«å€ãã£ãŠããŸãã
ã€ãŸããããªãåçŽãªæ°åŠã䜿çšããŠãããçš®ã®ã³ã³ããŒãã³ããååŸããããå°ãäœæ¥ããåŸãæ°ããçããããããã£ãè¿œå ã§ããŸãã ãã¯ã»ã«ã·ã§ãŒããŒã®å¯èœæ§ã¯æ¬è³ªçã«ç¡éã§ãããæ°åŠã®ç¥èãšã·ã§ãŒããŒã®äœæã¹ãã«ã«ãã£ãŠã®ã¿å¶éãããŸãã
ãããŠãGLSLã«ãšã£ãŠä»ã«è¯ãããšã¯ããããã®ç¡éã®å¯èœæ§ã«å ããŠãJavaScriptéçºè ãããã³ããšã³ãéçºè ã«æ°é®®ãªæ¯å¹ãäžããŸãã ããªãã¯JavaScriptãäœå¹ŽãæžããŠãããããªãã¯ãããåŸæã§ãããäœãæ°ãããã®ã欲ãããšç解ããŠããŸãããããã¯ãšã³ãã§ã¯ãããæãã§ããŸããã ãã®å ŽåãGLSLã¯ããªãã®äººçãå€ããå€æ§åããè¯ãéžæè¢ã§ãã
ã©ããããããšãïŒ
ã¬ããŒããæ°ã«å ¥ã£ãå Žåã HolyJS 2018 Piterã¯æ¥é±æ¢ã«éå¬ãããããã¹ãããã§è¬æŒãè¡ããããã©ãŠã¶ãŒã§ã®æå·åã®ãã€ãã³ã°ïŒGPUãWebAssemblyãJavaScriptãããã³è©Šãã¹ããã¹ãŠã®è¯ãããšããããŒãã«ããŠããŸãã ãŸããã¬ããŒãåŸã®ãã£ã¹ã«ãã·ã§ã³ãšãªã¢ã§ã¯ãæ°ããã¬ããŒãã®ãããã¯ãšã·ã§ãŒããŒã«ã€ããŠã圌ã«é©åã«è³ªåããããšãã§ããŸãã Denisã«å ããŠãä»ã«ãæ°å人ã®è¬æŒè ãããŸã ã詳现ã«ã€ããŠã¯ã HolyJS Webãµã€ããã芧ãã ãã ã