Androidã¢ããªã±ãŒã·ã§ã³ãWebGLã«ç§»æ€ãããšããã¢ã€ãã¢
çŸåšãWebGLã¯ã»ãšãã©ãã¹ãŠã®ããã€ã¹ã§ãµããŒããããŠãããã¢ãã€ã«ããã€ã¹ã§ãéåžžã«å®å®ããŠè¿ éã«åäœããããããã®ãã¯ãããžãŒã«äœããå®è£ ããããšããã®ã¯éåžžã«èå³æ·±ãããšã§ããã Androidã®OpenGL ES 2.0ã«ã¯ãã§ã«å€ãã®çµéšããããŸããããªãå€ãã®ç°ãªã3次å ã©ã€ãå£çŽãäœæããŸããã

ãããã®ã¢ããªã±ãŒã·ã§ã³ã¯ãæ¢è£œã®ãµãŒãããŒãã£ãšã³ãžã³ïŒUnityãªã©ïŒãOpenGLãæäœããããã®é«ã¬ãã«ãã¬ãŒã ã¯ãŒã¯ïŒlibGDXãªã©ïŒã䜿çšããã«äœæããŸããã ã³ãŒãã«ã¯ãµãŒãããŒãã£ã®ãã¬ãŒã ã¯ãŒã¯ã®å¶éã課ãããŠããªããããã¢ããªã±ãŒã·ã§ã³ã¯éåžžã«å°ããé«éã§ãããåã¢ããªã±ãŒã·ã§ã³ã®ããŒãºã«åãããŠã¬ã³ããªã³ã°ãå®å šã«æé©åããããšãã§ããŸãã
WebGLã¯OpenGL ES 2.0ã«åºã¥ããŠãããããå£çŽã®ç§»æ€ããã»ã¹ã¯éåžžã«åçŽã§ç°¡åã§ãã
ã¬ã³ããªã³ã°ãã¬ãŒã ã¯ãŒã¯
å ã®Javaã³ãŒããšåæ§ã«ã BaseRendererããã³BaseShaderã®åºæ¬ã¯ã©ã¹ãå®è£ ãããŠããŸãã ãã®è¡šèšæ³ã¯ã³ãŒãã®èªã¿ããããç°¡çŽ åãããããECMAScript 2015ã¯ã©ã¹ã䜿çšããããšã決å®ãããŸãããJSã¯ã©ã¹ããµããŒãããªããã©ãŠã¶ãŒã¯IE11ã®ã¿ã§ãã BaseRendererã«ã¯ãWebGLã³ã³ããã¹ãã®äœæãåæåããŠã£ã³ããŠã®ãµã€ãºå€æŽã®è¿œè·¡ãªã©ã®ã³ãŒããå«ãŸããŠããŸãããŸããã·ãŒã³ãã¬ã³ããªã³ã°ããããã®ç©ºã®ãã¹ã¿ããããããŸãã BaseShaderã«ã¯ãã·ã§ãŒããŒãã³ã³ãã€ã«ããã³äœ¿çšããããã®ã³ãŒããå«ãŸããŠããŸãã å®éãã·ãŒã³ã®ã¬ã³ããªã³ã°èªäœãšãã®ããã®ããŒã¿ã®èªã¿èŸŒã¿ã¯ã BitcoinRendererã«å®è£ ãããŠããŸã ã
æºåãã§ããããŒã¿ãããŠã³ããŒããã
ã»ãšãã©ã®WebGLãšã³ãžã³ãšãã¢ã¯ãJSONãOBJããŸãã¯ãã®ä»ã®åœ¢åŒã®ãã¡ã€ã«ããããŒã¿ãããŒãããŸãã äžæ¹ã§ãããã¯äŸ¿å©ã§ã-BlenderãŸãã¯3ds Maxããã¢ãã«ããšã¯ã¹ããŒãããŠãã·ãŒã³ã§äœ¿çšããã ãã§ãã ãã ããäžæ¹ã§ããã®ã¢ãããŒãã§ã¯ããããªã«ãŒãã§äœ¿çšå¯èœãªããŒã¿ãå«ããããã¡ãäœæããããã«ãã¯ã©ã€ã¢ã³ãã§ãœãŒã¹ããŒã¿ãè¿œå åŠçããå¿ èŠããããŸãã ãŸãããããã®åœ¢åŒã®ããŒã¿ã«ã¯å€ãã®åé·ãªæ å ±ãå«ãŸããŠããããšãå€ãã䜿çšãããŠããŸãããããœãŒã¹ãã¡ã€ã«ã®å€§éšåãå ããããã転éãããããŒã¿éãå€§å¹ ã«å¢å ããŸãã åæã«ããããã®2ã€ã®æ¬ ç¹ã¯ãåçŽãªWebGLãã¢ã§ãããããªãã®æéããŒãããŠéå§ãããšããäºå®ã«ã€ãªãããŸãã
ãã¬ãŒã ã¯ãŒã¯ã®JavaããŒãžã§ã³ã§ã¯ãOpenGLãããã¡ãŒã«çŽæ¥ããŒãããæºåãã§ããŠãããã€ããªããŒã¿ã䜿çšããJSããŒãžã§ã³ã§ã¯åãã¢ãããŒãã䜿çšããŸãã XMLHttpRequestã¬ãã«2ã¯ãJavaScriptã§ã®ãã€ããªããŒã¿åŠçããµããŒãããŠããŸãã XHR2ã§ã®äœæ¥ãç°¡çŽ åããããã«ãåçŽãªã¯ã©ã¹BinaryDataLoaderãäœæãããŸãã ã
FullModelã¯ã©ã¹ã¯ãã¡ãã·ã¥ã®åŠçãæäŸããŸãã loadïŒïŒã¡ãœããã¯ãã€ã³ããã¯ã¹ãšããŒã¿ïŒé ç¹åº§æšãUV座æšãªã©ïŒã䜿çšããŠãã¢ãã«ã®2ã€ã®ãããã¡ãŒãããŒãããŸãã ãããã®ãããã¡ã«ã¯ãã°ã©ãã£ãã¯ã«ãŒãã§äœ¿çšå¯èœãªãã€ããªããŒã¿ãå«ãŸããŠããŸãã ãã®ã¯ã©ã¹ã«ã¯bindBuffersïŒïŒã¡ãœããããããŸãããã®ã¡ãœããã¯å®éã«ãããã¡ãŒããã€ã³ããã glDrawElementsïŒïŒã®çŽåã«åŒã³åºãå¿ èŠããããŸãã
ETC1圢åŒã®å§çž®ãã¯ã¹ãã£
ã©ã€ãå£çŽã«ãããªã¡ã¢ãªãä¿åããããã«ãããŸããŸãªå§çž®ãã¯ã¹ãã£ã䜿çšããŸãã Javaãã¬ãŒã ã¯ãŒã¯ã¯ETC1ãETC2ãPVRTCãããã³ASTC圢åŒããµããŒãããç¹å®ã®ããã€ã¹ã®æ©èœã«åºã¥ããŠæãé©åãªãã¯ã¹ãã£ã䜿çšããŸãã WebGLã¯ETC1ãšéå§çž®RGBãã¯ã¹ãã£ã®ã¿ãå®è£ ããŸãã
OpenGL ES 2.0ã§ã¯ãETC1ã¯æšæºã®å¿ é éšåã§ãããäŸå€ãªããã¹ãŠã®ããã€ã¹ã§ãµããŒããããŠããŸãã ãã ããETC1å§çž®ã®ãµããŒãã¯WebGLã§ã¯äžèŠã§ããã WEBGL_compressed_texture_etc1æ¡åŒµæ©èœã確èªããå¿ èŠããããŸãã IE11ããã³Edgeãé€ããã¹ãŠã®ãã¹ã¯ããããã©ãŠã¶ã¯ããã®æ¡åŒµæ©èœããµããŒãããŠããŸãã Microsoftãã©ãŠã¶ãŒã®å Žåãéå§çž®ãã¯ã¹ãã£ã䜿çšããå¿ èŠããããŸãã
ãã®äŸ¿å©ãªããŒãžã䜿çšããŠããã©ãŠã¶ã§ãµããŒããããŠãããã¯ã¹ãã£åœ¢åŒã確èªã§ããŸã ã
ETC1ãã¯ã¹ãã£ã䜿çšãããããã§ãã¡ã¢ãªã®äœ¿çšéãå€§å¹ ã«æžãããã¯ã¹ãã£ã®ããŒãããã»ã¹ãé«éåããããšãã§ããŸããã çµå±ã®ãšããããããªã¡ã¢ãªã«å ¥ãåã«ããŸãéå§çž®ãã¯ã¹ãã£ãå ã®åœ¢åŒïŒPNGãJPEGãWebPãGIFãªã©ïŒããããããããïŒRGBAãŸãã¯RGBãã¢ã«ãã¡ãã£ãã«ãããŸãã¯ãªãïŒã«ãã³ãŒãããå¿ èŠããããŸãããããªã«ãŒãã«ããŠã³ããŒãããããã«ãã©ã€ããŒã«è»¢éãããŸãã ETC1ãã¯ã¹ãã£ã¯äºååŠçãå¿ èŠãšããŸãã-ãããªã«ãŒãã§çŽæ¥äœ¿çšããæºåãã§ããŠãããããèªã¿èŸŒã¿ãã¯ããã«é«éã§ãã
ããšãã°ãã¡ã¢ãªã®ç¯çŽã«ã€ããŠè©±ããšããµã€ãºã512x512ãã¯ã»ã«ã®éå§çž®RGBãã¯ã¹ãã£ã¯768 kbããããŸãããåãETC1ãã¯ã¹ãã£ã¯128 kbããããããŸããã ãã ããETC1ã¯å®å šã§ã¯ãªããããã€ãã®å§çž®ã¢ãŒãã£ãã¡ã¯ããçºçããŸãã ãããã®ã¢ãŒãã£ãã¡ã¯ãã¯ãæ¡æ£ãããããã³ç §æãããã§ã¯ã»ãšãã©èŠããŸããããæ³ç·ãããïŒ4x4ãã¯ã»ã«ãããã¯ã®åœ¢ã®æªã¿ïŒããã³åå°ãããïŒäžæ£ç¢ºãªè²åçŸïŒã§ã¯éåžžã«ç®ç«ã¡ãŸãã ãã®ãããå質èŠä»¶ã«å¿ããŠãå§çž®ãã¯ã¹ãã£ãšéå§çž®ãã¯ã¹ãã£ã®äž¡æ¹ã䜿çšããŸãã
Androidã§ã¯ãETC1ãã¯ã¹ãã£ã®ããŒãã¯éåžžã«ç°¡åã§ããPKM圢åŒã®ãã¡ã€ã«ãããã¯ã¹ãã£ãããŒããããã¹ãŠã®äœæ¥ãè¡ãæšæºãŠãŒãã£ãªãã£ETC1UtilããããŸãã WebGLã¯æ¢ç¥ã®åœ¢åŒããå§çž®ãã¯ã¹ãã£ãããŠã³ããŒãããæ段ãæäŸããªããããPKM圢åŒã®ãã¡ã€ã«ããETC1ãã¯ã¹ãã£ããŒããŒãäœæããå¿ èŠããããŸããã PKMã¯éåžžã«åçŽãªåœ¢åŒã§ã16ãã€ãã®ããããŒãšãããã«ç¶ããããªã«ãŒãã«ã¢ããããŒãããæºåãã§ãããã€ããªããŒã¿ã§æ§æãããŠããŸãã ããå€ãã®èŠåºãæ å ±ã¯ãããšããã«ãããŸã ã ãã¯ã¹ãã£ã®ãµã€ãºãååŸããã³ãŒããäœæããéãç¹å®ã®JavaScriptã®å¶éããããŸããã ãããã®å€ã¯16ãããã®ããã°ãšã³ãã£ã¢ã³æŽæ°ãšããŠä¿åãããŸãã ãã ãã Int16Arrayã䜿çšããŠãããã®çªå·ãååŸããããšã¯æ©èœããŸãããJavaScriptã«ã¯ãããã¡ãŒã®ãã€ãé åºãèšå®ããæ¹æ³ããªãããã Uint8Arrayã䜿çšããŠãã€ããèªã¿åããåä¿¡ããäœãã€ããšé«ãã€ãã®ãã¢ããæåã§16ãããå€ãèšç®ããå¿ èŠããã£ãããã§ã
ã·ã§ãŒããŒ
ã¢ããªã±ãŒã·ã§ã³ã¯ãããŒãã«ãµãŒãã§ã¹çšãšã³ã€ã³ã¢ãã«çšã®2ã€ã®ã·ã§ãŒããŒã®ã¿ã䜿çšããŸãã
ããŒãã«ã·ã§ãŒããŒã¯ãã©ã€ããããã®åçŽãªå®è£ ã§ãã 2ã€ã®ãã¯ã¹ãã£ã䜿çšããŸãã1ã€ã¯ã«ã©ãŒãããïŒæ¡æ£ïŒã§ããªãŒã®ãã¯ã¹ãã£ãèšå®ãã2ã€ç®ã¯ã©ã€ããããã§ãã ã·ã§ãŒããŒã®çµæã¯ããããã®ãã¯ã¹ãã£ã®è²ãåçŽã«ä¹ç®ããããšã§ãã
ã³ã€ã³ã·ã§ãŒããŒã¯ããè€éã§ã次ã®æ©èœãå«ãŸããŠããŸãã
- çé¢åå°ãããïŒããããçé¢ãããã³ã°ãŸãã¯ããããã£ããïŒ
- è²åŒ·åãããã©ã€ãããã
- æ³ç·ããã
çé¢åå°ãããã¯ãã¯ãã ããŒã«ã®åçã®ããã«èŠããåçã«æ å ±ãä¿åããŸãã

ä»ã®åå°ææ³ãšæ¯èŒããŠãçé¢å°å³ã«ã¯æ¬¡ã®å©ç¹ããããŸãã
+ã·ã³ãã«ãªã·ã§ãŒããŒã³ãŒããšé«æ§èœ
+ 1ã€ã®ãã¯ã¹ãã£ã®ã¿ã䜿çšãã
+åå°ã®ãããã¯ã¹ãã£ã¯ãPhotoshopãªã©ã®ã°ã©ãã£ãã¯ãšãã£ã¿ãŒã§ç°¡åã«åŠçã§ããŸãã
-å¹³ããªè¡šé¢ã§ã¯ããŸãæ©èœããªã
-ãã¯ã¹ãã£ç©ºéã®äžéšãç¡é§ã«ãªããŸãïŒè§ã¯äœ¿çšãããŸããïŒ
çé¢å°å³ã®æ倧ã®å©ç¹ã¯ãå®è£ ãç°¡åãªããšã§ãã ã¹ã¯ãªãŒã³ç©ºéã§èšç®ãããæ³ç·ãæ¢ã«ããå Žåã¯ããã®ïŒx; yïŒã³ã³ããŒãã³ããååŸããã ãã§ãã¯ã¹ãã£ãèªã¿åãããšãã§ããŸãã ã·ã§ãŒããŒã³ãŒãããã®æç²ïŒ
vec4 sphereColor = texture2D(sphereMap, vec2(vNormal2.x, vNormal2.y));
ããã¯ããã®ææ³ã®æ倧ã®æ¬ ç¹ãæå³ããŸããèšç®ã«ã¯ç»é¢ã®æ³ç·ã®ã¿ãé¢äžããããã倧ããªå¶æ°ããªãŽã³ãåãè²ã§å¡ãã€ã¶ãããŸãïŒãµãŒãã§ã¹å šäœã§åãæ³ç·ãæã€ããïŒã ãããŠãã³ã€ã³ã¢ãã«ã¯ãäž»ã«å€§ããªå¹³ããªè¡šé¢ã§æ§æãããŠããŸãã ãã®æ¬ ç¹ã«å¯ŸåŠããããã«ãæ³ç·ããããè¿œå ãããã€ãºãç¢æãæ°åãªã©ãè¿œå ããŠå¯èœãªéãå€æ§åããŸããã ãã®æè¡ã¯æ»ãããªè¡šé¢ã®ã¢ãã«ã奪ããçé¢åå°ã¯å®å šã«æ©èœããŸãã
ã³ã€ã³ãç §ãããšããè¿œå ã®ããªãã¯ã䜿çšãããŸããã ã³ã€ã³ãã·ã§ãŒãã£ã³ã°ããããã«ãã©ã€ããããã䜿çšãããŸãã ãã ããè²ãšç §æãããã®åçŽãªä¹ç®ã¯ãå€å°æ£ç¢ºã§ããéå±ãªçµæã«ãªããŸããæãå Žæã¯åçŽã«æããªããŸãã ããã«å ããŠãæãå Žæã§ã¯ã powïŒïŒé¢æ°ã䜿çšããŠèªåã§è²ãæããŸãã 次æ°ãé«ãã»ã©ãæŸå°ç §åºŠãããã¯æããªããŸãã ããã¯ãå ãéããã空éã®ããã©ãããã«å ¥ãæ¹æ³ã®å¹æãåçŸããéå±è¡šé¢ããã®å€éåå°ã«ãããã®è²ã匷調ããŸãã ãã®çµæãããçŸå®çãªéå±è¡šé¢ãåŸãããŸãã

çµæ
å®æãããã¢ã¯ãã®ããŒãžã§èŠãããšãã§ããŸã ã ãã¹ãŠã®ãœãŒã¹ã¯GitHubã§å ¥æã§ã ãMITã©ã€ã»ã³ã¹ã®äžã§ãããžã§ã¯ãã§äœ¿çšã§ããŸãã