Text μΈμ€ν΄μ€μ μ μ©λ 컀μ€ν μ °μ΄λλ μ λ§ λ©μ§ μ λλ©μ΄μ ν¨κ³Όλ₯Ό κ°λ₯νκ² ν μ μμ΅λλ€. μ΄λ€ μ€ λ§μ κ²½μ° κ° λ¬Έμ/κΈλ¦¬νλ₯Ό λ 립μ μΌλ‘ μ²λ¦¬νκΈ°λ₯Ό μν κ²μ΄λ©°, μ΄λ₯Ό μν΄μλ νμ¬ λ λλ§λκ³ μλ λ¬Έμλ₯Ό μλ €μ£Όλ μ °μ΄λμ 무μΈκ°κ° νμν©λλ€.
μ΄λ‘ μ μΌλ‘ 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/ μ λ§€μ° μ μ¬νκ² μ€ λ° λ¨μ΄λΉ μ λλ©μ΄μ μ΄ νμ±νλ©λλ€(μ΄ λ³κ²½μ΄ νμ±νν μ μλ μ’μ μλ₯Ό κ³ λ €ν μ μμ).
μ΄κ²μ΄ νλκ·Έλ¨ΌνΈ μ °μ΄λμμ ν ν°λ³(λ¬Έμ, λ¨μ΄, μ€) λ³κ²½λ νμ©νλ€κ³ κ°μ νλ κ²μ΄ λ§μ΅λκΉ?
μ΄κ²μ΄ νλκ·Έλ¨ΌνΈ μ °μ΄λμμ ν ν°λ³(λ¬Έμ, λ¨μ΄, μ€) λ³κ²½λ νμ©νλ€κ³ κ°μ νλ κ²μ΄ λ§μ΅λκΉ?
κ°λ³μΌλ‘ μ μ μμ μ‘°κ°μΌλ‘ μ λ¬ν΄μΌ νμ§λ§ κ·Έλ μ΅λλ€. :)
μ°λ¦¬λ ν λΌκ΅΄ μλλ‘...
λ€μ λͺ¨λ μΈλ±μ€μ λν μ©λμ κ° μΈλ±μ€μ μ΄ κ°μλ₯Ό μκ°ν μ μμ΅λλ€.
μ°λ¦¬λ μ΄λ¬ν λͺ¨λ μ΅νΈμΈμ λ§λ€κ³ μ°λ¦¬κ° λμ νλ μλ‘μ΄ glsl μμ±μ μλ₯Ό μ΅μννκΈ° μν΄ μ€λ§νΈ ν¨νΉμ μννκ³ μΆμ΅λλ€. μ΄ APIμ λν΄ λ μκ°ν΄μΌ ν©λλ€.
μ¬μ©μκ° νλκ·Έλ₯Ό μ¬μ©νμ¬ λͺ¨λ μ ννλλ‘ ν μ μμΌλ―λ‘
{
split: { λ¨μ΄: 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 κΈμ λ μ΄λΈμ΄ μμ΅λλ€. λ·° 맀νΈλ¦μ€λ λͺ¨λΈλ§ 맀νΈλ¦μ€μ μ μ©λ μ€μΌμΌλ§μ μκ΄μμ΄ νμ λ·°μ΄λ₯Ό ν₯νλλ‘ μ‘°μ νκ³ νλ©΄μμ νμ λμΌν ν¬κΈ°κ° λλλ‘ μ‘°μ ν©λλ€.
μ§κΈμ λ μ΄λΈλΉ νλμ Text
κ°μ²΄λ₯Ό λ§λ€κ³ λ³νμ μ μ©ν©λλ€.
λͺ¨λ λ μ΄λΈμ λ¨μΌ ν
μ€νΈλ‘ ν¬μ₯νκ³ μ μ μ
°μ΄λμμ μ¬λ°λ₯Έ λ³νμ μννκΈ° μν΄ κ° λ μ΄λΈμ ꡬμ μμΉλ₯Ό κ°λ μμ±μ κ°μ§μΌλ‘μ¨ ν¨μ¬ λ λμ μ±λ₯μ μ»μ μ μλ€κ³ μκ°νμ΅λλ€.
@lojjic μ¬μ©μ μ§μ μ
°μ΄λλ₯Ό λ§λλ λ°©λ²μ λ¬Έμνν μ μμ΅λκΉ? BufferGeometry
μ κΈ°μ‘΄ λ©μλ setAttribute
μ²λΌ μμ±μ μΆκ°νλ κ²μ μ΄λ ΅μ§ μμ κ²μ΄λΌκ³ μκ°ν©λλ€.
λ΄κ° κ³ λ €νκ³ μλ λ€λ₯Έ μ΅μ μ λͺ¨λ λ μ΄λΈμ 3κ°μ κΈμκ° μκΈ° λλ¬Έμ μΈμ€ν΄μ€ λ λλ§μ λλ€. κ·Έλ¬λ κ·Έκ²μ νμ€ν WebGL 2λ₯Ό νμλ‘ ν κ²μ΄κ³ μ μ΄λ μ²μμλ κ°μΉκ° μκΈ°μλ λ무 볡μ‘ν μ μμ΅λλ€.
@FunMiles λλ λΉμ μ΄ μ³λ€κ³ μκ°ν©λλ€. μ΄κ²μ κ·Έλ° μ’ λ₯μ μΌμ μ©μ΄νκ² ν μ μμ΅λλ€. λ΄κ° μ¬λ°λ₯΄κ² μ΄ν΄νκ³ μλ€λ©΄ μ΅μ νμλ λ λΆλΆμ΄ ν¬ν¨λ μ μμ΅λλ€.
1μ κ²½μ° μ΄ μ견 μ μ΄ν΄λ³΄μμμ€. μ€μ λ‘ μ΄λ―Έ κ·νμ μꡬμ μΆ©λΆν μ μμ΅λλ€. μ΄λ κΈ°λ³Έμ μΌλ‘ material
λ‘ μ§μ νλ 컀μ€ν
μ
°μ΄λλ₯Ό μ μ©νλ λ°©λ²μ λν μ’μ λ°λͺ¨μ΄κΈ°λ ν©λλ€. κ±°κΈ°μ Troikaμ createDerivedMaterial μ νΈλ¦¬ν°λ₯Ό μ¬μ©νμ§λ§ ShaderMaterial
λλ μ체 onBeforeCompile
μμ μ΄ μλ μ¬λ£λ₯Ό μ μ¬νκ² μ λ¬ν μ μμ΅λλ€.
2μ κ²½μ° λ¨μΌ ν μ€νΈλ₯Ό λ λλ§ν λ€μ _some_ μμ±μ μ¬μ©νμ¬ κ΅¬μ²΄ μ£Όμμ κ°λ³ λ¬Έμλ₯Ό λ체ν μ μλ€κ³ μκ°ν©λλ€. μ΄λ² νΈμμ μ€λͺ νλ μλ‘μ΄ λ¬Έμ/λ¨μ΄ μΈλ±μ€ μμ±μ΄ λμμ΄ λ μ μμ§λ§ κΌ νμνμ§ νμ μ΄ μμ§ μμ΅λλ€. μ΄λ¬ν λ³μλ₯Ό μλ‘μ΄ InstancedBufferAttributeλ‘ μΈμ½λ©ν μ μμ΅λλ€. μ¬κΈ°μμ κ° λ²‘ν°λ ν λ¬Έμμ λν λ³μλ₯Ό 보μ ν©λλ€(ν μ€νΈμ κΈ°ννμ κ° κΈλ¦¬νμ λν΄ μΈμ€ν΄μ€νλλ κ°λ¨ν μΏΌλμ΄λ―λ‘ κ° κΈλ¦¬νμ λν΄ μΆκ° InstancedBufferAttributesκ° λ¨κ³μ μΌλ‘ μ§νλ©λλ€).
λλ λΉμ μ΄ μ΄κ²μνλ λ° μ΄μ΄ μλμ§ μκ³ μΆμ΅λλ€!
@lojjic μ¬λ°λ₯΄κ² μ΄ν΄νμ΅λλ€. κ·Έλ¦¬κ³ λ§ν¬ν μ½λλ (1)μ νμν κ²μ 90%λ₯Ό μνν©λλ€. κ·νμ λ°λͺ¨λ μ μ¬μ© μ¬λ‘μ λ¬νκ² μΌμΉν©λλ€.
λ΄ μ΄ν΄λ₯Ό μμ νλλ‘ μμ²ν μ μλ κ²½μ° λ€μμ λΉμ μ΄ νλ μΌμ 보λ λ°©λ²μ
λλ€.
mvPosition
λ λͺ¨λΈ λ·° 곡κ°μ κΈ°μ€μ μμΉλ‘ μ΄κΈ°νλ©λλ€. λλ κ·Έ κΈ°μ€μ μ΄ κΈ°μ€μ μ΄λΌκ³ κ°μ νλ€. λ§λμ?position
λ ν΄λΉ μ°Έμ‘°μ μΌλ‘λΆν°μ μ€νμ
μ΄λ©° x λ° yκ° 0μ΄ μλ μ’νλ§ μλ€κ³ κ°μ ν©λλ€. (κ·Έλμ μ€μΌμΌμ z κ΅¬μ± μμ κ³μ°μ 건λλΈ μ μλ€κ³ μκ°ν©λκΉ?) (μΆμ : μΈμ€ν΄μ€νλ λ λλ§ μ μ μ
°μ΄λ μ½λλ₯Ό 보면 ν
μ€νΈλ₯Ό νμ ν μ μλ κ² κ°μ΅λλ€. μ΄ κ²½μ° z κ΅¬μ± μμλ 0μ΄ μλλλ€)position
κ° μΆκ°λκ³ z-μ±λΆμ΄ 0μ΄λ©΄ μ΄ κΈ°μ¬λ ν¬μ νλ©΄κ³Ό ννν νλ©΄μμ μμΉλ₯Ό μ μ§ν©λλ€.(1)μ μννκΈ° μν΄ μ΄ μ½λμ λν λ³κ²½ μ¬νμ λλΆλΆ ν¬κΈ° μ‘°μ κ³Ό μ½κ°μ μ’ν μ΄λμ μμΌλ―λ‘ ν μ€νΈκ° λ΄κ° κ°μ§ ꡬ μΈλΆμ λ¨Έλ¬Όλλ‘ ν©λλ€.
2λ²λ μ΄ν΄νμ
¨λ€μ. κ·Έλ¬λ μ½λλ₯Ό μ½μ λ μ½κ° νΌλ μ€λ½μ΅λλ€. ν
μ€νΈ λ λλ§μ΄ μ΄λ―Έ μΈμ€ν΄μ€ λ λλ§μ΄λΌλ κ²μ κΉ¨λ«μ§ λͺ»νμ΅λλ€. λλ₯Ό νΌλμ€λ½κ² νλ κ²μ InstancedBufferAttribute
μμ νμλ $# GlyphsGeometry
#$ κ° μμ§λ§ Text
κ° InstancedMesh
μ΄ μλλΌ Mesh
μ νμ ν΄λμ€λΌλ κ²μ
λλ€. Three.jsλ₯Ό λ κΉμ΄ νκ³ λ€μ΄μΌ ν κ² κ°μ΅λλ€.
κ·Έλ μ§ μμΌλ©΄ κ° λ¬Έμκ° μΈμ€ν΄μ€νλλ κ²½μ° κ° κΈλ¦¬ν μΈμ€ν΄μ€μ λν΄ position
λ₯Ό μ€νμ
νλ 벑ν°κ° μλ μμ±λ§ μμΌλ©΄ λ©λλ€. λ§λμ?
λλ μ΄κ²μμ μ μ λ¨μ΄μ ΈμΌνμ§λ§ λ€μμ λΉ λ₯Έ μν μ λ°μ΄νΈμ λλ€.
PR #109λ λ€μν μΉ΄μ΄νΈλ₯Ό μμ§νκ³ λ ΈμΆνλ μΈ‘λ©΄μμ κ½€ κ²¬κ³ νκ² λκ»΄μ§λλ€. λλ κ·Έλ€μ΄ μ΅νΈμΈνκ² νκ³ μΆμ§λ§ κ·Έλ μ§ μμΌλ©΄ κ·Έκ²μ΄ μ΄λμ μλμ§μ λ§μ‘±ν©λλ€.
κ·Έλ¬λ μ °μ΄λ κΈ°λ° μ λλ©μ΄μ μλ μ΄λ¬ν μλ‘μ΄ μΉ΄μ΄νΈλΏλ§ μλλΌ λ€μκ³Ό κ°μ λ€λ₯Έ λ°μ΄ν°μ λν μ‘μΈμ€λ νμνλ€λ κ°ν μ§κ°μ΄ μμ΅λλ€.
μ΄λ€ μ€ μΌλΆλ μ΄λ―Έ κΈ°μ μ μΌλ‘ μ °μ΄λμ μ‘΄μ¬νμ§λ§ μ¬μ©μκ° μ΄μ μμ‘΄νλ €λ©΄ μΉμν μ΄λ¦μΌλ‘ λ ΈμΆνκ³ μ λ’°ν μ μλ κ³μ½μΌλ‘ λ¬Έμνν΄μΌ ν©λλ€.
λꡬλ μ§ κ·Έ PR λΈλμΉλ₯Ό κ°μ§κ³ λκ³ μΌλΆ μ °μ΄λ μ λλ©μ΄μ μ ꡬνν΄ λ³΄κ³ μ΄λ€ μ λ³΄κ° λλ½λμλμ§ μλ €μ£Όλ©΄ ν° λμμ΄ λ κ²μ λλ€.
@lojjic μ΄ κΈ°λ₯μ λν κ΄μ¬μ νννκ³ μΆμ λΏμ λλ€ πΊ
https://github.com/canadaduane/troika/tree/char-indices μμ μ΅μ λ§μ€ν°μμ λ³ν© μΆ©λμ ν΄κ²°νμ΅λλ€.
μμ§ ν μ€νΈν κΈ°νκ° μμμ§λ§ λ©°μΉ λ΄λ‘ ν μ€νΈν μμ μ λλ€.
λλ μ€λ«λμ μ΄ ν λ‘ μμ λ¨μ΄μ Έ μμλ€. κ·Έλ¬λ λλ κ·Έκ²μ λ€μλ³΄κ³ μΆλ€λ κ²μ μκΈ° μμΌ°μ΅λλ€.
μ΄ κ²μλ¬Όμ λμ createDerivedMaterial
λ₯Ό μ¬μ©νμ¬ μνν μμ
μ μκ° μμ΅λλ€.
κ·Έλ¬λ μ§κΈμ λ μ΄λΈλΉ νλμ λ©μ¬κ° μκ³ λ μ΄λΈ μκ° λ§€μ° λ§μμ§λ©΄ μ κ°ν μ νκΈ°μμ λ λλ§μ΄ ν¬κ² νλ€λ¦½λλ€. κ° λ μ΄λΈμ λν CPU νΈμΆ λλ¬Έμ΄λΌκ³ κ°μ ν©λλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ¬λ¬ λ©μλ₯Ό λͺ¨λ λ μ΄λΈμ΄ μλ λ¨μΌ λ©μλ‘ λ°κΎΈκ³ λλ¨Έμ§λ κ°μ λ μ μ μ
°μ΄λλ₯Ό μ¬μ©νκ³ μΆμ΅λλ€.
@lojjic μ΄ μΈκΈνλ―μ΄ λ¨μ΄μ μ½κ°μ κ²½κ³κ° νμνλ€κ³ μκ°ν©λλ€. λλ μ μ΄λ λ΄κ° μ¬μ©νκΈ° μν΄ κ° λ¨μ΄μ μ€μ¬.
λ€λ₯Έ λ°©λ²μΌλ‘ μννλ λ°©λ²μ΄λ ν΄λΉ μΌν°λ₯Ό μ»λ λ°©λ²μ λν λ€λ₯Έ μ μμ΄ μμ΅λκΉ?
κ°μ₯ μ μ©ν λκΈ
μ 리ν΄μΌ ν κ²μ΄ λ§μ§λ§ μμ κ°μμ λν μ΄κΈ° POCκ° μμ΅λλ€. λ€μμ νλκ·Έλ¨ΌνΈ μ °μ΄λμμ μμμ λ³κ²½νκΈ° μν΄ λ€μν μΈλ±μ€/μ΄ μμ μ¬μ©νλ μμ λλ€.
charIndex / totalChars:
charInWordIndex / totalCharsInWord:
charInLineIndex / totalCharsInLine:
wordIndex / totalWords: (μ΄ μμμ charIndex/totalCharsμ λ§€μ° μ μ¬ν΄ 보μ΄μ§λ§ λ―Έλ¬ν μ°¨μ΄κ° μμ΅λλ€)
wordInLineIndex / totalWordsInLine:
lineIndex / totalLines:
λλ λͺ¨λ λ°μ΄ν°λ₯Ό μ΅λ 3κ°μ μ λνΌ + 2κ°μ μμ±μΌλ‘ κ°μ Έμ¬ μ μμλλ°, μ΄λ κ½€ μ’μ΅λλ€. λλ μ¬μ ν κ·Έκ²λ€μ μ νμ μΌλ‘ λ§λ€κ³ μΆλ€.