Ludum Dareã®æºåãããŠããã¯ã»ã«ã·ã§ãŒããŒã䜿çšããåçŽãªã²ãŒã ãäœæããããšããããŸãïŒä»ã¯Phaserãšã³ãžã³ã«æã¡èŸŒãŸããŸããã§ããïŒã
ã·ã§ãŒããŒãšã¯äœã§ããïŒã·ã§ãŒããŒã¯ãã°ã©ãã£ãã¯ã«ãŒãã§å®è¡ãããGLSL Cã®ãããªããã°ã©ã ã§ãã ã·ã§ãŒããŒã«ã¯2ã€ã®ã¿ã€ãããããŸãããã®èšäºã§ã¯ããã¯ã»ã«ã·ã§ãŒããŒïŒããã©ã°ã¡ã³ããããã©ã°ã¡ã³ãã·ã§ãŒããŒã§ããããŸãïŒã«ã€ããŠèª¬æããŸãã
color = pixelShader(x, y, ...other attributes)
ã€ãŸã åºåç»åã®åãã¯ã»ã«ã«å¯ŸããŠã·ã§ãŒããŒãå®è¡ããããã®è²ã決å®ãŸãã¯èª¿æŽãããŸãã
ããã®å¥ã®èšäºïŒ https://habr.com/post/333002/ïŒã§çŽ¹ä»èšäºãèªãããšãã§ããŸãã
ãã¹ãåŸãç§ã¯ãªã³ã¯ãå人ã«æãã圌ãããããã¯æ®éã§ããïŒããšãã質åã®ã¹ã¯ãªãŒã³ã·ã§ãããåãåããŸããã
ããããããã¯æ£åžžã§ã¯ãããŸããã§ããã ã·ã§ãŒããŒã³ãŒãã泚ææ·±ã調ã¹ããšãããèšç®ãšã©ãŒãèŠã€ãããŸããã
if (t < M) { realColor = mix(color1,color2, pow(1. - t / R1, 0.5)); }
ãªããªã R1ã¯Mããå°ãããããå Žåã«ãã£ãŠã¯ãpowã®æåã®åŒæ°ã§ããŒãããå°ããæ°å€ãååŸãããŸããã è² ã®æ°ã®å¹³æ¹æ ¹ã¯ãå°ãªããšãGLSLèŠæ Œã«ãšã£ãŠã¯äžæè°ãªããšã§ãã ç§ã®ãããªã«ãŒãã¯æ··ä¹±ãããã©ãããããããã®äœçœ®ããæãåºããŸããïŒããŠ0ããæ»ããããã§ãïŒããå人ã«ãšã£ãŠã¯èªã¿ãããããšãããããŸããã
ãããŠãç§ã¯èããŸããïŒå°æ¥ç§ã¯ãã®ãããªåé¡ãé¿ããããšãã§ããŸããïŒ ééããç¹ã«ããŒã«ã«ã§åçŸãããŠããªãééãããå®å
šãªäººã¯ããŸããã GLSLã®åäœãã¹ãã¯äœæã§ããŸããã åæã«ãã·ã§ãŒããŒå
ã®å€æã¯éåžžã«åçŽã§ã-ä¹ç®ãé€ç®ãæ£åŒŠãäœåŒŠ...åå€æ°ã®å€ã远跡ããã©ã®ãããªç¶æ³ã§ã蚱容å€ãè¶
ããªãããã«ããããšã¯æ¬åœã«äžå¯èœã§ããïŒ
ããã§ãGLSLã®éçåæãè©Šã¿ãããšã«ããŸããã ããã®ç±æ¥-ããªãã¯ã«ããã®äžã§ãããèªãããšãã§ããŸãã
ããã«èŠåããŸããå®æåã¯å
¥æã§ããŸããã§ãããæè²çšã®ãããã¿ã€ãã®ã¿ã§ãã
äºååæ
ãã®ãããã¯ã«é¢ããæ¢åã®èšäºãå°ã調ã¹ãŠïŒãããŠããã®ãããã¯ãValue Range AnalysisãšåŒã°ããããšãåæã«çºèŠããŸããïŒãGLSLããããä»ã®èšèªããªãã£ãããšãå¬ããæããŸããã èªåã§å€æããïŒ
- ããã€ããã¯ã¹ããªã-é¢æ°ãã€ã³ã¿ãŒãã§ãŒã¹ãèªåçã«æšæž¬ãããåãªã©ãžã®åç
§
- çŽæ¥ã¡ã¢ãªåŠçãªã
- ã¢ãžã¥ãŒã«ãªãããªã³ã¯ãé
延ãã€ã³ãã£ã³ã°-ã·ã§ãŒããŒãœãŒã¹ã³ãŒãå
šäœãå®å
šã«å©çšå¯èœ
å
¥åå€ã®ç¯å²ã¯äžè¬çã«ããç¥ãããŠããŸã - ããã€ãã®ããŒã¿åãããã³ãããã¯ãããŒããäžå¿ã«å±éããŸãã int / boolã¯ãã£ãã«äœ¿çšãããããããã«åŸãããšã¯ããã»ã©éèŠã§ã¯ãããŸãã
- ifsãšloopsã¯ãã£ãã«äœ¿çšãããŸããïŒããã©ãŒãã³ã¹ã®åé¡ã®ããïŒã ã«ãŒãã䜿çšããå Žåãå€ãã®å Žåãé
åãééããããç¹å®ã®å¹æãæ°åç¹°ãè¿ãããããããã®åçŽãªã«ãŠã³ã¿ãŒã§ãã 誰ãGLSLã§ãã®ãããªææãæžããªãã§ãããïŒç§ã¯é¡ã£ãŠããŸãïŒã
// - https://homepages.dcc.ufmg.br/~fernando/classes/dcc888/ementa/slides/RangeAnalysis.pdf k = 0 while k < 100: i = 0 j = k while i < j: i = i + 1 j = j â 1 k = k + 1
äžè¬ã«ãGLSLã®å¶éãèãããšãã¿ã¹ã¯ã¯è§£æ±ºå¯èœãšæãããŸãã äž»ãªã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã
- ã·ã§ãŒããŒã³ãŒãã解æããå€æ°ã®å€ãå€æŽããäžé£ã®ã³ãã³ããäœæããŸã
- å€æ°ã®åæç¯å²ãææ¡ããã·ãŒã±ã³ã¹ãå®è¡ããå€æ°ãå€æŽããããšãã«ç¯å²ãæŽæ°ãã
- ç¯å²ãç¹å®ã®å¢çã«éåããŠããå ŽåïŒããšãã°ãè² ã®æ°ãå
¥åãããå ŽåããŸãã¯1ãã倧ããå€ãèµ€ã®ã³ã³ããŒãã³ãã®ãåºåè²ãgl_FragColorã«ãªãå ŽåïŒãèŠåã衚瀺ããå¿
èŠããããŸã
䜿çšæè¡
ããã§ç§ã¯é·ãèŸãéžæãããŸããã äžæ¹ã§ãç§ã®äž»ãªã¹ã³ãŒãã¯WebGLã·ã§ãŒããŒããã§ãã¯ããããšãªã®ã§ãéçºäžã«ãã©ãŠã¶ãŒã§ãã¹ãŠãå®è¡ããããã«javascriptã䜿çšããªãã®ã¯ãªãã§ããã äžæ¹ãç§ã¯é·ãéPhaserãéããŠãUnityãLibGDXã®ãããªå¥ã®ãšã³ãžã³ãè©Šãããšãèšç»ããŠããŸãã ã·ã§ãŒããŒããããŸãããjavascriptã¯ãªããªããŸãã
ãããŠç¬¬äžã«ãä»äºã¯äž»ã«åš¯æ¥œã®ããã«è¡ãããŸããã ãããŠãäžçã§æé«ã®ãšã³ã¿ãŒãã€ã¡ã³ãã¯åç©åã§ãã ãããã£ãŠïŒ
- JavaScriptã§è¡ãããGLSLã³ãŒãã®è§£æã ASTã§GLSLã解æããããã®ã©ã€ãã©ãªãããã«èŠã€ããããã¹ãUIãWebããŒã¹ã§ããããšã«æ
£ããŠããããã§ãã ASTã¯äžé£ã®ã³ãã³ãã«å€ããã...
- ... 2çªç®ã®éšåã¯ãC ++ã§èšè¿°ãããWebAssemblyã«ã³ã³ãã€ã«ãããŸãã ç§ã¯ãã®æ¹æ³ã決ããŸããïŒC ++ã©ã€ãã©ãªã䜿çšããŠãã®ã¢ãã©ã€ã¶ãŒãçªç¶ä»ã®ãšã³ãžã³ã«åºå®ãããå Žåã¯ããããæãç°¡åã«è¡ãå¿
èŠããããŸãã
ããŒã«ãããã«é¢ããããã€ãã®èšè- Visual Studio Codeãã¡ã€ã³IDEãšããŠäœ¿çšããäžè¬çã«ã¯æºè¶³ããŠããŸãã 幞çŠã®ããã«äœããå¿
èŠã§ã-äž»ãªããšã¯ãCtrl +ã¯ãªãã¯ãæ©èœããå
¥åæã«ãªãŒãã³ã³ããªãŒãããå¿
èŠãããããšã§ãã ã©ã¡ãã®é¢æ°ãC ++ãšJSã®äž¡æ¹ã§æ£åžžã«æ©èœããŸãã ãŸããç°ãªãIDEãçžäºã«åãæ¿ããªãããšãçŽ æŽãããã§ãã
- C ++ãã³ã³ãã€ã«ããããã«ãWebAssemblyã¯cheerpããŒã«ã䜿çšããŸãïŒææã§ããããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§ã¯ç¡æã§ãïŒã ã³ãŒãã®æé©å以å€ã®åé¡ãé€ããŠããã®äœ¿çšã«é¢ããŠåé¡ã¯çºçããŸããã§ããããããã§èª°ã®ãããªã®ãããããŸãã-cheerpèªäœãŸãã¯ããã«ãã£ãŠäœ¿çšãããclangã³ã³ãã€ã©ãŒã
- C ++ã§ã®åäœãã¹ãã§ã¯ãå€ãè¯ãgtestã䜿ããŸãã
- ãã³ãã«ã§jsããã«ãããã«ã¯ãããã€ãã®ãã€ã¯ããã³ãã«ãå¿
èŠã§ããã 圌ã¯ã1 npmããã±ãŒãžãšããã€ãã®ã³ãã³ãã©ã€ã³ãã©ã°ãå¿
èŠããšããç§ã®èŠä»¶ãæºãããŠããŸããããåæã«åé¡ããããŸããã§ããã åä¿¡ããjavascriptãã¡ãã»ãŒãž
[Object object]
ã§è§£æäžã«ãšã©ãŒãçºçãããšãæèšãã¯ã©ãã·ã¥ãããšããŸããããããã¯ããŸã圹ã«ç«ã¡ãŸããã
ãã¹ãŠãä»ãããªãã¯è¡ãããšãã§ããŸãã
ã¢ãã«ã«ã€ããŠç°¡åã«
ã¢ãã©ã€ã¶ãŒã¯ãã·ã§ãŒããŒã§æ€åºãããå€æ°ã®ãªã¹ããã¡ã¢ãªãŒã«ä¿æããããããã«ã€ããŠãçŸåšå¯èœãªå€ã®ç¯å²ïŒ [0,1]
ãŸãã¯[1,â)
ïŒãä¿åããŸãã
ã¢ãã©ã€ã¶ãŒã¯ã次ã®ãããªã¯ãŒã¯ãããŒãåãåããŸãã
cmdId: 10 opCode: sin arguments: [1,2,-,-,3,4,-,-]
ããã§ãsiné¢æ°ãåŒã³åºãããid = 3ããã³4ã®å€æ°ãããã«å
¥åãããçµæãå€æ°1ããã³2ã«æžã蟌ãŸããŸãããã®åŒã³åºãã¯GLSLçªç®ã«å¯Ÿå¿ããŸãã
vec2 a = sin(b)
空ã®åŒæ°ïŒã-ããšããŠããŒã¯ïŒã«æ³šæããŠãã ããã GLSLã§ã¯ãã»ãšãã©ãã¹ãŠã®çµã¿èŸŒã¿é¢æ°ãããŸããŸãªå
¥åã¿ã€ãã®ã»ããã«å¯ŸããŠãªãŒããŒããŒããããŠããŸãã sin(float)
ã sin(vec2)
ã sin(vec3)
ã sin(vec4)
ãŸãã 䟿å®äžããªãŒããŒããŒãããããã¹ãŠã®ããŒãžã§ã³ã1ã€ã®åœ¢åŒsin(vec4)
ãã®å Žåã¯sin(vec4)
ãŸãã
ã¢ãã©ã€ã¶ã¯ã次ã®ããã«åå€æ°ã®å€æŽã®ãªã¹ããåºåããŸã
cmdId: 10 branchId: 1 variable: 2 range: [-1,1]
ããã¯ãããã©ã³ã1ã®10è¡ç®ã®å€æ°2ã®ç¯å²ã¯-1ãã1ãŸã§ã®ç¯å²ã«ãããããšãæå³ããŸãïŒåŸã§èª¬æãããã©ã³ãïŒã ããã§ããœãŒã¹ã³ãŒãã®å€ã®ç¯å²ãçŸãããã€ã©ã€ãã§ããŸãã
è¯ãã¹ã¿ãŒã
ASTããªãŒããã§ã«ã³ãã³ãã®ãªã¹ãã«å€ããå§ããããæšæºã®é¢æ°ãšã¡ãœãããå®è£
ãããšããæ¥ãŸããã ãããã¯éåžžã«å€ããããŸãïŒãŸããç§ãäžã§æžããããã«ããããã«ã¯å€æ°ã®ãªãŒããŒããŒãããããŸãïŒããäžè¬ã«ãäºæž¬å¯èœãªç¯å²å€æããããŸãã ãã®ãããªäŸã§ã¯ããã¹ãŠãæããã«ãªããšããŸãããã
uniform float angle; // -> (-â,â) //... float y = sin(angle); // -> [-1,1] float ynorm = 1 + y; // -> [0,2] gl_FragColor.r = ynorm / 2.; // -> [0,1]
åºåè²ã®èµ€ãã£ãã«ã¯èš±å®¹ç¯å²å
ã§ããããšã©ãŒã¯ãããŸããã
ããå€ãã®çµã¿èŸŒã¿é¢æ°ãã«ããŒããå Žåãã·ã§ãŒããŒã®ååã«ã€ããŠã¯ããã®ãããªåæã§ååã§ãã ããããåŸåã¯ã©ãã§ããïŒæ¡ä»¶ãã«ãŒããé¢æ°ã«ã€ããŠã¯ã©ãã§ããããïŒ
æ
ã·ã§ãŒããŒãäŸã«ãšã£ãŠã¿ãŸãããã
uniform sampler2D uSampler; uniform vec2 uv;
å€æ°a
ã¯ãã¯ã¹ãã£ããååŸãããããããã®å€æ°ã®å€ã¯0ã1ã«ãªããŸãããããã k
ã¯ã©ã®å€ãåãããšãã§ããŸããïŒ
ç°¡åãªæ¹æ³ã§ããã©ã³ããçµ±äžãããããšãã§ããŸã-åã±ãŒã¹ã®ç¯å²ãèšç®ããåèšãåºããŸãã ifåå²ã«ã€ããŠã¯ã k = [0,2]
ãååŸããelseåå²ã«ã€ããŠã¯ã k = [0,1]
ãååŸããŸãã çµã¿åããããš[0,2]
ã«ãªãããšã©ãŒãåºãå¿
èŠããããŸãããªããªã 1ãã倧ããå€ã¯gl_FragColor
åºåè²ã«gl_FragColor
ãŸãã
ãã ããããã¯æãããªèª€å ±ã§ãããéçã¢ãã©ã€ã¶ãŒã®å Žåã¯èª€æ€ç¥ãããæªãããšã¯ãããŸãããããªãªã«ããã®æåã®å«ã³ã®åŸããããŠç¢ºå®ã«10ååŸã«ãªãã«ãããªãå Žåã
ãããã£ãŠãäž¡æ¹ã®ãã©ã³ããå¥ã
ã«åŠçããå¿
èŠããããäž¡æ¹ã®ãã©ã³ãã§å€æ°a
ç¯å²ãæ確ã«ããå¿
èŠããããŸãïŒæ£åŒã«ã¯å€æŽãããŠããŸãããïŒã ããã¯æ¬¡ã®ãããªãã®ã§ãã
ãã©ã³ã1ïŒ
if (a < 0.5) {
ãã©ã³ã2ïŒ
if (a >= 0.5) {
ãããã£ãŠãã¢ãã©ã€ã¶ãŒã¯ãç¯å²ã«å¿ããŠç°ãªãåäœãããç¹å®ã®æ¡ä»¶ã«ééãããšãã±ãŒã¹ããšã«ãã©ã³ãïŒãã©ã³ãïŒãäœæããŸãã ãããã®å Žåãã圌ã¯ãœãŒã¹å€æ°ã®ç¯å²ãçµã蟌ã¿ãã³ãã³ãã®ãªã¹ãã«é²ã¿ãŸãã
ãã®å Žåã®åå²ã¯ãif-elseæ§é ã«é¢é£ããŠããªãããšãæ確ã«ãã䟡å€ããããŸãã å€æ°ã®ç¯å²ããµãç¯å²ã«åå²ããããšããã©ã³ããäœæãããŸããåå ã¯ããªãã·ã§ã³ã®æ¡ä»¶ã¹ããŒãã¡ã³ãã§ããå¯èœæ§ããããŸãã ããšãã°ãstepé¢æ°ã¯ãã©ã³ããäœæããŸãã 次ã®GLSLã·ã§ãŒããŒã¯åã®ã·ã§ãŒããŒãšåãããšãè¡ããŸãããåå²ã䜿çšããŸããïŒããã¯ãããã©ãŒãã³ã¹ã®ç¹ã§åªããŠããŸãïŒã
float a = texture2D(uSampler, uv).a; float k = mix(a * 2., 1. - a, step(0.5, a)); gl_FragColor = vec4(1.) * k;
ã¹ãããé¢æ°ã¯ã<0.5ã®å Žåã¯0ãè¿ããããã§ãªãå Žåã¯1ãè¿ããŸãã ãããã£ãŠãããã§ããã©ã³ããäœæãããŸã-åã®äŸãšåæ§ã§ãã
ä»ã®å€æ°ã®æ¹è¯
å°ãå€æŽãããåã®äŸãèããŠã¿ãŸããã
float a = texture2D(uSampler, uv).a;
ããã§ããã¥ã¢ã³ã¹ã¯æ¬¡ã®ãšããã§ããå€æ°b
ã«é¢ããŠåå²ãçºçããå€æ°b
ã䜿çšããŠèšç®ãçºçããŸãã ã€ãŸããåãã©ã³ãå
ã«ã¯ç¯å²b
æ£ããå€ããããŸãããå®å
šã«äžå¿
èŠã§ãããç¯å²b
ã®å
ã®å€ã¯å®å
šã«æ£ãããããŸããã
ãã ããã¢ãã©ã€ã¶ãŒã¯ã b
ããèšç®ããããšã«ãã£ãŠç¯å²b
ãååŸãããããšã確èªããŸãa
ã ãã®æ
å ±ãèŠããŠããã°ãåå²æã«ã¢ãã©ã€ã¶ãŒã¯ãã¹ãŠã®ãœãŒã¹å€æ°ã調ã¹ãŠãéèšç®ãå®è¡ããŠç¯å²ãçµã蟌ãããšãã§ããŸãã
é¢æ°ãšã«ãŒã
GLSLã«ã¯ä»®æ³ã¡ãœãããé¢æ°ãã€ã³ã¿ãŒããŸãã¯ååž°åŒã³åºããããªãããããã¹ãŠã®é¢æ°åŒã³åºãã¯äžæã§ãã ãããã£ãŠãé¢æ°ã®æ¬äœãåŒã³åºãã®å ŽæïŒã€ãŸãã€ã³ã©ã€ã³ïŒã«æ¿å
¥ããã®ãæãç°¡åã§ãã ããã¯ãã³ãã³ãã®ã·ãŒã±ã³ã¹ãšå®å
šã«äžèŽããŸãã
ãµã€ã¯ã«ã§ã¯ãã£ãšè€éã§ã æ£åŒã«ã¯ãGLSLã¯Cã®ãããªforã«ãŒããå®å
šã«ãµããŒãããŠããŸãã ãã ããã»ãšãã©ã®å Žåãã«ãŒãã¯æ¬¡ã®ããã«æãåçŽãªåœ¢åŒã§äœ¿çšãããŸãã
for (int i = 0; i < 12; i++) {}
ãã®ãããªãµã€ã¯ã«ã¯ç°¡åã«ãå±éãã§ããŸãã ã«ãŒãã®æ¬äœã次ã
ã«12åæ¿å
¥ããŸãã ãã®çµæãç§ã¯ãããŸã§ããã®ãããªãªãã·ã§ã³ã®ã¿ããµããŒãããããšã«ããŸããã
ãã®ã¢ãããŒãã®å©ç¹ã¯ãããã«åå©çšããããã«ãã©ã°ã¡ã³ãïŒé¢æ°æ¬äœãã«ãŒããªã©ïŒãèšæ¶ããå¿
èŠãªããã¢ãã©ã€ã¶ãŒã«ã¹ããªãŒã ã§ã³ãã³ããçºè¡ã§ããããšã§ãã
åé¡ããããã¢ãã
åé¡ïŒ1ïŒæ確åãå°é£ãŸãã¯äžå¯èœ
äžèšã§ã¯ãããå€æ°ã®å€ã粟補ãããšãã«ãå¥ã®å€æ°ã®å€ã«ã€ããŠçµè«ãåŒãåºããå Žåãæ€èšããŸããã ãããŠããã®åé¡ã¯ãå ç®/æžç®ãªã©ã®æŒç®ãé¢ä¿ãããšãã«è§£æ±ºãããŸãã ããããããšãã°ãäžè§æ³ãã©ããããïŒ ããšãã°ã次ã®ãããªæ¡ä»¶ïŒ
float a = getSomeValue(); if (sin(a) > 0.) {
å
åŽã®ç¯å²ã®èšç®æ¹æ³ã¯ïŒ ååšçã®ã¹ããããæã€ç¡éã®ç¯å²ã®ã»ãããå€æããŸãããããã¯äœæ¥ããã®ã«éåžžã«äžäŸ¿ã§ãã
ãããŠããã®ãããªç¶æ³ããããããããŸããïŒ
float a = getSomeValue();
äžè¬çãªå Žåã®ç¯å²a
ãšb
æ確åã¯éçŸå®çã§ãã ãããã£ãŠã誀æ€ç¥ãçºçããå¯èœæ§ããããŸãã
åé¡ïŒ2ïŒäŸåç¯å²
ãã®äŸãèããŠã¿ãŸãããïŒ
uniform float value //-> [0,1]; void main() { float val2 = value - 1.; gl_FragColor = vec4(value - val2); }
ã¯ããã«ãã¢ãã©ã€ã¶ãŒã¯å€æ°val2
ç¯å²ãèæ
®ããŸã- [0,1] - 1 == [-1, 0]
ãã ãã value - val2
èæ
®ãããšãã¢ãã©ã€ã¶ãŒã¯val2
ãvalue
ããååŸãããããšãèæ
®ãããç¯å²ãäºãã«ç¬ç«ããŠããããã«æ©èœããŸãã [0,1] - [-1,0] = [0,2]
ååŸãããšã©ãŒãå ±åããŸãã å®éã«ã¯ã圌ã¯äžå®ã®1ãæã£ãŠããã¹ãã§ããã
èãããã解決çïŒåå€æ°ã«ã€ããŠãç¯å²ã®å±¥æŽã ãã§ãªããã家系å³ãå
šäœãä¿åãã-ã©ã®å€æ°ãäŸåããŠããããã©ã®æäœãªã©ãä¿åãããã å¥ã®ããšã¯ããã®è¡çµ±ããåºãããããšã¯å®¹æã§ã¯ãªããšããããšã§ãã
åé¡ïŒ3ïŒæé»çã«äŸåããç¯å²
以äžã«äŸã瀺ããŸãã
float k = sin(a) + cos(a)
ããã§ãã¢ãã©ã€ã¶ã¯k = [-1,1] + [-1,1] = [-2,2]
ã®ç¯å²ãæ³å®ããŸãã ééã£ãŠããããªããªã sin(a) + cos(a)
ã¯a
ã®ç¯å²[-â2, â2]
ãŸãã
sin(a)
ã®èšç®çµæã¯sin(a)
æ£åŒã«ã¯cos(a)
èšç®çµæã«äŸåããŸããã ãã ãããããã¯åãç¯å²ã®a
ã«äŸåããŸãã
ãŸãšããšçµè«
çµå±ã®ãšãããGLSLã®ãããªåçŽã§é«åºŠã«å°éåãããèšèªã§ãã£ãŠããå€ã®ç¯å²åæãè¡ãããšã¯ç°¡åãªäœæ¥ã§ã¯ãããŸããã èšèªæ©èœã®é©çšç¯å²ãããã«åŒ·åã§ããŸããé
åããããªãã¯ã¹ãããã³ãã¹ãŠã®çµã¿èŸŒã¿æäœã®ãµããŒãã¯ãåã«æéã®ãããçŽç²ã«æè¡çãªã¿ã¹ã¯ã§ãã ããããå€æ°éã®äŸåé¢ä¿ãããç¶æ³ãã©ã®ããã«è§£æ±ºããã-質åã¯ç§ã«ã¯ãŸã æ確ã§ã¯ãããŸããã ãããã®åé¡ã解決ããªããšã誀æ€ç¥ã¯é¿ãããããæçµçã«éçãã€ãºè§£æã®å©ç¹ãäžåããã€ãºãçºçããŸãã
ç§ãåºäŒã£ãããšãèãããšãä»ã®èšèªã§ã®å€ç¯å²åæã®ããã®ããã€ãã®æåãªããŒã«ããªãããšã«ç¹ã«é©ãã¯ããŸãã-æ¯èŒçåçŽãªGLSLãããæããã«å€ãã®åé¡ããããŸãã åæã«ãä»ã®èšèªã§ã¯å°ãªããšãåäœãã¹ããæžãããšãã§ããŸãããããã§ã¯ã§ããŸããã
å¥ã®è§£æ±ºçã¯ãä»ã®èšèªããGLSLã«ã³ã³ãã€ã«ããããšã§ã ãããæè¿ãkotlinããã®ã³ã³ãã€ã«ã«é¢ããèšäºããããŸãã ã ãã®åŸããœãŒã¹ã³ãŒãã®åäœãã¹ããèšè¿°ãããã¹ãŠã®å¢çæ¡ä»¶ãã«ããŒã§ããŸãã ãŸãã¯ãå
ã®kotlinã³ãŒããä»ããŠã·ã§ãŒããŒã«éãããããŒã¿ãšåãããŒã¿ãå®è¡ããèµ·ããããåé¡ã«ã€ããŠèŠåããããã€ãããã¯ã¢ãã©ã€ã¶ãŒããäœæããŸãã
ãã®ããããã®æç¹ã§åæ¢ããŸããã æ®å¿µãªãããã©ã€ãã©ãªã¯æ©èœããŸããã§ãããããããããã®ãããã¿ã€ãã¯èª°ãã«åœ¹ç«ã€ã§ãããã
ã¬ãã¥ãŒçšã®githubã®ãªããžããªïŒ
è©Šãã«ã¯ïŒ
ããŒãã¹ïŒç°ãªãã³ã³ãã€ã©ãã©ã°ã䜿çšããWebã¢ã»ã³ããªæ©èœ
æåã¯ãstdlibã䜿çšããã«ã¢ãã©ã€ã¶ãŒãå®è¡ããŸãããããã¯ãé
åãšãã€ã³ã¿ãŒã䜿çšããæãªããã®æ¹æ³ã§ãã ãã®ãšããåºåwasmãã¡ã€ã«ã®ãµã€ãºãéåžžã«å¿é
ã§ããã®ã§ããµã€ãºãå°ãããããã£ãã®ã§ãã ããããããæç¹ããäžå¿«æãæããããã«ãªã£ãããããã¹ãŠãstdlibã«è»¢éããããšã«ããŸãããã¹ããŒããã€ã³ã¿ãŒãéåžžã®ã³ã¬ã¯ã·ã§ã³ãããã ãã§ãã
ãããã£ãŠãç§ã¯ã©ã€ãã©ãªã®2ã€ã®ããŒãžã§ã³ã®ã¢ã»ã³ããªã®çµæãæ¯èŒããæ©äŒãåŸãŸãã-stdlibã®æç¡ã ããŠããŸããè¯ã/æªãcheerpïŒããã³ããã«ãã£ãŠäœ¿çšãããclangïŒãã³ãŒããæé©åããæ¹æ³ã確èªããŠãã ããã
ãããã£ãŠãç°ãªãæé©åãã©ã°ã®ã»ããïŒ -O0
ã -O1
ã -O2
ã -O3
ã -Os
ãããã³-Oz
ïŒã䜿çšããŠäž¡æ¹ã®ããŒãžã§ã³ã-Os
ãããããã®ããŒãžã§ã³ã®äžéšã«ã€ããŠã1,000ãã©ã³ãã§3,000ãªãã¬ãŒã·ã§ã³ã®åæé床ã枬å®ããŸããã ç§ã¯åæããŸãããæ倧ã®äŸã§ã¯ãããŸããããæ¯èŒåæã«ã¯ç§èŠã§ååã§ãã
wasmãã¡ã€ã«ã®ãµã€ãºã«å¿ããŠäœãèµ·ãã£ãã®ãïŒ
é©ãã¹ãããšã«ãããŒããæé©åã®ãµã€ãºãªãã·ã§ã³ã¯ãä»ã®ã»ãšãã©ãã¹ãŠã®ãªãã·ã§ã³ãããåªããŠããŸãã O3
ã¯ãäžçäžã®ãããããã®ã®ç©æ¥µçãªã€ã³ã©ã€ã³åããããããã«ãã£ãŠãã€ããªãèšåŒµãããšæ³å®ããŸãã stdlibãªãã®äºæ³ãããããŒãžã§ã³ã¯ããã³ã³ãã¯ãã§ãããããã»ã©å€ããããŸãã ãã®ãããªå±èŸ±ã«èãã 䟿å©ãªã³ã¬ã¯ã·ã§ã³ãæ±ãåã³ãèªåèªèº«ãã奪ãããšã
å®è¡é床å¥ïŒ
-O0
ãšæ¯èŒãããšã -O3
ãã³ãé£ã¹ãŠãç¡é§ã§-O3
ãªãããšãããã-O3
ã åæã«ãstdlibã䜿çšããããŒãžã§ã³ãšäœ¿çšããªãããŒãžã§ã³ã®éãã¯å®è³ªçã«ãããŸããïŒ10å枬å®ããŸããããæ°åã倧ãããããšéãã¯å®å
šã«ãªããªããšæããŸãïŒã
2ã€ã®ç¹ã«æ³šç®ãã䟡å€ããããŸãã
- ã°ã©ãã¯åæã®é£ç¶ãã10åã®å®è¡ããã®å¹³åå€ã瀺ããŠããŸããããã¹ãŠã®ãã¹ãã§æåã®åæã¯æ®ãã®åæããã2åé·ãç¶ããŸããïŒã€ãŸãã120ããªç§ã次ã¯æ¢ã«60ããªç§ååŸïŒã WebAssemblyã®åæåãããããè¡ãããŸããã
-O3
ãã©ã°ã䜿çšããŠãä»ã®ãã©ã°ã§ã¯ãã£ããããªãã£ãã²ã©ãå¥åŠãªãã°ãããã€ãååŸããŸããã ããšãã°ãminããã³maxé¢æ°ã¯ãminãšåãããã«çªç¶åãããã«æ©èœãå§ããŸããã
ãããã«
ãæž
èŽããããšãããããŸããã
å€æ°ã®å€ãå¢çãè¶
ããªãããã«ããŸãã
ãããŠããã«è¡ããŸãã