ããã¹ãã€ã³ã¹ã¿ã³ã¹ã«ã«ã¹ã¿ã ã·ã§ãŒããŒãé©çšãããšãéåžžã«åªããã¢ãã¡ãŒã·ã§ã³å¹æãåŸãããå¯èœæ§ããããŸãã ãããã®å€ãã§ã¯ãåæå/ã°ãªããåå¥ã«åŠçããå¿ èŠããããŸãããã®ããã«ã¯ãçŸåšã¬ã³ããªã³ã°ãããŠããæåã瀺ãã·ã§ãŒããŒå ã®äœããå¿ èŠã§ãã
ã°ãªãã¯ã¯ããã«ã€ã³ã¹ã¿ã³ã¹åã䜿çšãããããçè«çgl_InstanceID
ã䜿çšã§ããŸãã ãããŠããã®ã¡ãã£ãšãã䞊ã¹æ¿ãã¯æ©èœããŸãïŒ https ://codesandbox.io/s/zealous-water-m8lzq?file=/src/index.js-ãããã gl_InstanceID
ã¯WebGL2ã§ã®ã¿å©çšå¯èœã§ããã void main
以å€ã®é¢æ°å
ã§äœ¿çšãããšãANGLEå®è£
ã§å£ããŸãã ãããã£ãŠãçŸæç¹ã§ã¯ããã«ã¯çŸå®çã«äœ¿çšã§ããŸããã
代ããã«ã attribute float charIndex;
ã®ãããªç¬èªã®ã€ã³ã¹ã¿ã³ã¹å±æ§ãè¿œå ã§ããŸããããã¯ãå¢åæåã€ã³ããã¯ã¹ãä¿æããã ãã§ãã ã«ã¹ã¿ã ã·ã§ãŒããŒã¯ãããå©çšã§ããŸãã
å¿
èŠããªãå Žåã«äœåãªå±æ§é
åãäœæããªãããã«ããããã«ãããããtextmesh.includeCharIndexInShader = true
ã®ãããªãªããã€ã³æ©èœã«ãããã§ãããã
ãŸãå€åïŒ wordIndex
ã lineIndex
...ïŒ
åèªãšè¡ã¯ã httpsïŒ//greensock.com/splittext/ã®ããã«ãè¡ããšããã³åèªããšã®ã¢ãã¡ãŒã·ã§ã³ã§æå¹ã«ãªããŸãïŒããã¯ããã®å€æŽã«ãã£ãŠæå¹ã«ãªãè¯ãäŸãšèŠãªãããšãã§ããŸãïŒ
ããã«ããããã©ã°ã¡ã³ãã·ã§ãŒããŒã§ããŒã¯ã³ããšïŒcharãwordãlineïŒã®å€æŽãå¯èœã«ãªããšæããŸããïŒ
ããã«ããããã©ã°ã¡ã³ãã·ã§ãŒããŒã§ããŒã¯ã³ããšïŒcharãwordãlineïŒã®å€æŽãå¯èœã«ãªããšæããŸããïŒ
é ç¹ãããã©ã°ã¡ã³ãã«å€åãšããŠæž¡ãå¿ èŠããããŸãããããã§ãã :)
ãããã®ç©ŽãäžããŠè¡ããŸã...
次ã®ãã¹ãŠã®ã€ã³ããã¯ã¹ã®çšéãšãããããã®åèšæ°ãèããããšãã§ããŸãã
ããããã¹ãŠããªããã€ã³ããã¹ããŒããããã³ã°ãå®è¡ããŠãå°å ¥ããæ°ããglslå±æ§ã®æ°ãæå°éã«æããããšèããŠããŸãã ãã®ããã®APIã«ã€ããŠãã£ãšèããå¿ èŠããããŸãã
ãŠãŒã¶ãŒã«ãã©ã°ãä»ããŠããããã¹ãŠãéžæãããããšãã§ããã®ã§ã
{{
åå²ïŒ{åèªïŒtrueãæåïŒtrueãè¡ïŒtrue}
}
ã¹ããŒããããã³ã°ãè¡ã
ãããæ¡åŒµããæ°ã§ããïŒ ç§ã¯èå³ããããŸãð
ãŠãŒã¶ãŒã«åå²ãéžæããããšããã¢ã€ãã¢ã奜ãã§ãã
ããã¯ãããšããããšã¯ã12åã®æ°ããattribute float foo
宣èšãè¿œå ããããªããšããããšã§ããããããªããšãå¶éã«éããŸãïŒwebglã§ã¯åèš16åã®å±æ§ã ãšæããŸãïŒããããããæ倧3åã®æ°ãããã®ã«ããã¯ã§ããŸãã attribute vec4 foo
宣èšãäœæããã·ã§ãŒããŒå
ã®èŠæ ãã®è¯ãfloat
å€æ°ã«è§£åããŸãã
ããããããšãŠãçã«ããªã£ãŠããŸããããããšãïŒ
charIndex
ã¯ãå¢åã«ç©ºçœãå«ããå¿
èŠããããŸããïŒ ãŸãã¯ã衚瀺ãããŠããã°ãªããã€ã³ã¯ãªã¡ã³ãããã ãã§ããïŒ ç®ã«èŠããã°ãªãã ãã«åŸããŠããŸãã
空çœãæ°ãããšãã€ã³ããã¯ã¹ã§ã¢ãã¡ãŒã·ã§ã³åãããšãã«å¥åŠãªãããããäœæãããã®ã§ãç§ãç®ã«èŠããæ¹åã«åŸãã§ããã
å®è¡ããã¯ãªãŒã³ã¢ããã¯ãããããããŸãããäžèšã®ã«ãŠã³ãã®åæPOCããããŸãã ãã©ã°ã¡ã³ãã·ã§ãŒããŒã§è²ãå€æŽããããã«ããŸããŸãªã€ã³ããã¯ã¹/åèšãã¢ã䜿çšããäŸã次ã«ç€ºããŸãã
charIndex / totalCharsïŒ
charInWordIndex / totalCharsInWordïŒ
charInLineIndex / totalCharsInLineïŒ
wordIndex / totalWords:(ãã®äŸã®charIndex/totalCharsãšéåžžã«ãã䌌ãŠããŸããã埮åŠãªéãããããŸãïŒ
wordInLineIndex / totalWordsInLineïŒ
lineIndex / totalLinesïŒ
ç§ã¯ãã¹ãŠã®ããŒã¿ãæ倧3ã€ã®ãŠããã©ãŒã +2ã€ã®å±æ§ã«å ¥ããããšãã§ããŸãããããã¯ããªãè¯ãããšã§ãã ç§ã¯ãŸã ãããããªãã·ã§ã³ã«ãããã§ãã
ãã°ãããïŒ ãã¹ãããŒãžã§ã³ã®æºåãã§ããããç¥ãããã ããð
ç§ã¯ããã察åŠã§ããæ©èœãå®è¡ããããšãæ¢ããŠããŸããã çã®åšãã«é
眮ãã3æåã®ã©ãã«ããããããããŸãã ãã¥ãŒãããªãã¯ã¹ãŸãã¯ã¢ããªã³ã°ãããªãã¯ã¹ã«é©çšãããã¹ã±ãŒãªã³ã°ã«é¢ä¿ãªããç»é¢äžã§åžžã«åããµã€ãºã«ãªãããã«ãåžžã«ãã¥ãŒã¢ã«é¢ããŠèª¿æŽãè¡ããŸãã
çŸåšãã©ãã«ããšã«1ã€ã®Text
ãªããžã§ã¯ããäœæããå€æãé©çšããŠããŸãã
ãã¹ãŠã®ã©ãã«ã1ã€ã®ããã¹ãã«ããã¯ããé ç¹ã·ã§ãŒããŒã§æ£ããå€æãè¡ãããã«åã©ãã«ã®çäžã®äœçœ®ãæã€å±æ§ãæã€ããšã§ãã¯ããã«åªããããã©ãŒãã³ã¹ãåŸãããšãã§ãããšèããŠããŸããã
@lojjicã«ã¹ã¿ã ã·ã§ãŒããŒãäœæããæ¹æ³ãææžåã§ããŸããïŒ BufferGeometry
ã®æ¢åã®ã¡ãœããsetAttribute
ãè¡ãããã«ãå±æ§ãè¿œå ããããšã¯é£ãããªããšæããŸãã
ç§ãæ€èšããŠããä»ã®ãªãã·ã§ã³ã¯ããã¹ãŠã®ã©ãã«ã3æåã§ãããããã€ã³ã¹ã¿ã³ã¹åãããã¬ã³ããªã³ã°ã§ãã ããããããã«ã¯ç¢ºãã«WebGL 2ãå¿ èŠã§ãããå°ãªããšãæåã¯è€éãããŠäŸ¡å€ããªãå¯èœæ§ããããŸãã
@FunMilesããªããæ£ãããšæããŸããããã¯ãã®çš®ã®ããšã容æã«ãããããããŸããã ç§ããããæ£ããç解ããŠããå Žåãæé©åã«ã¯2ã€ã®éšåãå«ãŸããå¯èœæ§ããããŸãã
1ã«ã€ããŠã¯ããã®ã³ã¡ã³ããèŠãŠãã ãããããã¯ãå®éã«ã¯ãã§ã«ããŒãºã«ååã§ããå¯èœæ§ããããŸãã ããã¯ãã«ã¹ã¿ã ã·ã§ãŒããŒãé©çšããæ¹æ³ã®è¯ããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã§ããããåºæ¬çã«ã¯material
ãšããŠå²ãåœãŠãã ãã§ãã ããã§Troikaã®createDerivedMaterialãŠãŒãã£ãªãã£ã䜿çšããŸããããåæ§ã«ãä»»æã®ShaderMaterial
ãŸãã¯ç¬èªã®onBeforeCompile
å€æŽãå ãããããªã¢ã«ãæž¡ãããšãã§ããŸãã
2ã®å Žåã1ã€ã®ããã¹ããã¬ã³ããªã³ã°ããŠããã_some_å±æ§ã䜿çšããŠãçã®åšãã®åã ã®æåã移åã§ããã®ã¯æ£ãããšæããŸãã ãã®å·ã§èª¬æãããŠããæ°ããchar/wordã€ã³ããã¯ã¹å±æ§ã¯åœ¹ç«ã€ãããããŸããããããããå¿ èŠãã©ããããããããŸããã ããããããããã®å€äœãæ°ããInstancedBufferAttributeã«ãšã³ã³ãŒãããããšãã§ããŸããããã§ãåãã¯ãã«ã¯1ã€ã®æåã®å€äœãä¿æããŸãïŒããã¹ãã®ãžãªã¡ããªã¯ãåã°ãªãã«å¯ŸããŠã€ã³ã¹ã¿ã³ã¹åãããåçŽãªã¯ã¯ããã§ãããããè¿œå ã®InstancedBufferAttributesã¯åã°ãªãã«å¯ŸããŠã¹ãããã¹ã«ãŒãããŸãïŒã
ããããã£ãŠéãè¯ãã£ããã©ããèå³ããããŸãïŒ
@lojjicããªãã¯æ£ããç解ããŸããã ãããŠãããªãããªã³ã¯ããã³ãŒãã¯ãç§ãå¿
èŠãšãããã®ã®90ïŒ
ãå®è¡ããŸãïŒ1ïŒã ããªãã®ãã¢ã¯ç§ã®ãŠãŒã¹ã±ãŒã¹ãšäžæ°å³ã«äžèŽããŠããŸãã
ç§ã®ç解ãæ£ãããã«é ŒããããããŸãããããããããªããããŠããããšãç§ãã©ã®ããã«èŠããã§ãïŒ
mvPosition
ã¯ãã¢ãã«ãã¥ãŒç©ºéã®åç
§ç¹ã®äœçœ®ã§åæåãããŸãã ãã®åºæºç¹ãã¢ã³ã«ãŒãã€ã³ãã ãšæããŸãã ããã§ããïŒposition
ã¯ãã®åç
§ç¹ããã®ãªãã»ããã§ãããxãšyã®éãŒã座æšãããªããšæããŸãã ïŒããã«ãããã¹ã±ãŒã«ã®zã³ã³ããŒãã³ãã®èšç®ãã¹ãããã§ãããšæããŸããïŒïŒïŒPSïŒã€ã³ã¹ã¿ã³ã¹åãããã¬ã³ããªã³ã°é ç¹ã·ã§ãŒããŒã³ãŒããèŠããšãããã¹ããå転ã§ããããã§ãããã®å Žåãzã³ã³ããŒãã³ãã¯ãŒãã«ãªããŸããïŒposition
ãè¿œå ãããzã³ã³ããŒãã³ãããŒãã®å Žåããã®å¯äžã«ãããæ圱平é¢ã«å¹³è¡ãªå¹³é¢å
ã®äœçœ®ãç¶æãããŸããïŒ1ïŒãå®è¡ããããã®ãã®ã³ãŒããžã®å€æŽã¯ãããã¹ããç§ãæã£ãŠããçã®å€åŽã«ãšã©ãŸãããã«ãäž»ã«ã¹ã±ãŒãªã³ã°ãšããããªåº§æšã·ããã«ãããŸãã
ããªãã¯2ãç解ããŸããã ãã ããã³ãŒããèªããšãã«å°ãæ··ä¹±ããŸãã ããã¹ãã¬ã³ããªã³ã°ããã§ã«ã€ã³ã¹ã¿ã³ã¹ã¬ã³ããªã³ã°ã§ããããšã«æ°ã¥ããŠããŸããã§ããã ç§ãæ··ä¹±ãããŠããã®ã¯ã InstancedBufferAttribute
ãã掟çãã$ GlyphsGeometry
ããããŸããã Text
ã¯Mesh
ã®ãµãã¯ã©ã¹ã§ããã InstancedMesh
ã§ã¯ãªããšããããšã§ãã ç§ã¯Three.jsããã£ãšæ·±ãæãäžããå¿
èŠããããšæããŸãã
ãã以å€ã®å Žåãåæåãã€ã³ã¹ã¿ã³ã¹åãããŠãããšãããšãåã°ãªãã€ã³ã¹ã¿ã³ã¹ã®position
ããªãã»ããããããã®ãã¯ãã«ãæã€å±æ§ã ããå¿
èŠã«ãªããŸãã ããã§ããïŒ
ç§ã¯ããããå°ãé¢ããªããã°ãªããŸããã§ããããããã«ç°¡åãªã¹ããŒã¿ã¹ã®æŽæ°ããããŸãïŒ
PRïŒ109ã¯ãããŸããŸãªã«ãŠã³ããåéããŠå ¬éãããšããç¹ã§ããªãå å®ã«æããŠããŸãã ç§ã¯åœŒãããªããã€ã³ããããã®ã§ãããããã§ãªããã°ç§ã¯ãããã©ãã«ãããã«æºè¶³ããŠããŸãã
ãã ããã·ã§ãŒããŒããŒã¹ã®ã¢ãã¡ãŒã·ã§ã³ã«ã¯ããããã®æ°ããã«ãŠã³ãã ãã§ãªãã次ã®ãããªä»ã®ããŒã¿ãžã®ã¢ã¯ã»ã¹ãå¿ èŠã«ãªããšãã匷ãäºæããããŸãã
ãããã®ããã€ãã¯ãã§ã«ã·ã§ãŒããŒã«æè¡çã«ååšããŠããŸããããŠãŒã¶ãŒããããã«äŸåããå Žåã¯ãããããããååã§å ¬éããä¿¡é Œã§ããå¥çŽãšããŠææžåããå¿ èŠããããŸãã
誰ãããã®PRãã©ã³ãã§éãã§ãããã€ãã®ã·ã§ãŒããŒã¢ãã¡ãŒã·ã§ã³ãå®è£ ããŠã¿ãŠãäžè¶³ããŠããæ å ±ãæããŠããããªããããã¯å€§ããªå©ãã«ãªãã§ãããã
@lojjicãã®æ©èœã«èå³ã瀺ãããã ãã§ãðº
ããã§ææ°ã®ãã¹ã¿ãŒãšã®ããŒãžã®ç«¶åã解決ããŸããïŒ https ïŒ//github.com/canadaduane/troika/tree/char-indices
ãŸã ãã¹ãããæ©äŒã¯ãããŸããããæ°æ¥äžã«ãã¹ãããäºå®ã§ãã
ç§ã¯é·ãéãã®è°è«ããé¢ããŠããŸããã ããããç§ã¯ãããããäžåºŠèŠãããšæã£ãããšãæãåºããŸããã
ãã®æçš¿ã®æåŸã«ã createDerivedMaterial
ã䜿çšããŠè¡ã£ãäŸã瀺ããŸãã
ãã ããçŸåšãã©ãã«ããšã«1ã€ã®ã¡ãã·ã¥ããããã©ãã«ã®æ°ãéåžžã«å€ããªããšãããŒãšã³ãã®é»è©±ã§ã¯ã¬ã³ããªã³ã°ãéåžžã«ãããããããŸãã åã©ãã«ã®CPUåŒã³åºããåå ã ãšæããŸãã ããã«å¯ŸåŠããããã«ãè€æ°ã®ã¡ãã·ã¥ããã¹ãŠã®ã©ãã«ãä»ããåäžã®ã¡ãã·ã¥ã«çœ®ãæããæ®ãã®åŠçã«ã¯æ¹è¯ãããé ç¹ã·ã§ãŒããŒã䜿çšããããšæããŸãã
@lojjicãèšã£ãããã«ãç§ã¯èšèã«ããã€ãã®éçãå¿
èŠã ãšæããŸãã ãŸãã¯ãå°ãªããšããç§ã®äœ¿çšã§ã¯ãååèªã®äžå¿ã§ãã
ãã以å€ã®æ¹æ³ã§ãããè¡ãæ¹æ³ããã®ã»ã³ã¿ãŒãååŸããæ¹æ³ã«é¢ããä»ã®ææ¡ã¯ãããŸããïŒ
æãåèã«ãªãã³ã¡ã³ã
å®è¡ããã¯ãªãŒã³ã¢ããã¯ãããããããŸãããäžèšã®ã«ãŠã³ãã®åæPOCããããŸãã ãã©ã°ã¡ã³ãã·ã§ãŒããŒã§è²ãå€æŽããããã«ããŸããŸãªã€ã³ããã¯ã¹/åèšãã¢ã䜿çšããäŸã次ã«ç€ºããŸãã
charIndex / totalCharsïŒ
charInWordIndex / totalCharsInWordïŒ
charInLineIndex / totalCharsInLineïŒ
wordIndex / totalWords:(ãã®äŸã®charIndex/totalCharsãšéåžžã«ãã䌌ãŠããŸããã埮åŠãªéãããããŸãïŒ
wordInLineIndex / totalWordsInLineïŒ
lineIndex / totalLinesïŒ
ç§ã¯ãã¹ãŠã®ããŒã¿ãæ倧3ã€ã®ãŠããã©ãŒã +2ã€ã®å±æ§ã«å ¥ããããšãã§ããŸãããããã¯ããªãè¯ãããšã§ãã ç§ã¯ãŸã ãããããªãã·ã§ã³ã«ãããã§ãã