Troika: κΈ°λŠ₯: ν…μŠ€νŠΈ μ§€μ˜€λ©”νŠΈλ¦¬μ— 문자/단어/라인 인덱슀 속성 μΆ”κ°€

에 λ§Œλ“  2021λ…„ 02μ›” 11일  Β·  18μ½”λ©˜νŠΈ  Β·  좜처: protectwise/troika

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 와 같은 옡트인 κΈ°λŠ₯으둜 λ§Œλ“€κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

정리해야 ν•  것이 λ§Žμ§€λ§Œ μœ„μ˜ κ°œμˆ˜μ— λŒ€ν•œ 초기 POCκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ ν”„λž˜κ·Έλ¨ΌνŠΈ μ…°μ΄λ”μ—μ„œ 색상을 λ³€κ²½ν•˜κΈ° μœ„ν•΄ λ‹€μ–‘ν•œ 인덱슀/총 μŒμ„ μ‚¬μš©ν•˜λŠ” μ˜ˆμž…λ‹ˆλ‹€.

charIndex / totalChars:
Screen Shot 2021-02-18 at 7 18 56 PM

charInWordIndex / totalCharsInWord:
Screen Shot 2021-02-18 at 7 19 01 PM

charInLineIndex / totalCharsInLine:
Screen Shot 2021-02-18 at 7 19 08 PM

wordIndex / totalWords: (이 μ˜ˆμ—μ„œ charIndex/totalChars와 맀우 μœ μ‚¬ν•΄ λ³΄μ΄μ§€λ§Œ λ―Έλ¬˜ν•œ 차이가 μžˆμŠ΅λ‹ˆλ‹€)
Screen Shot 2021-02-18 at 7 19 16 PM

wordInLineIndex / totalWordsInLine:
Screen Shot 2021-02-18 at 7 19 22 PM

lineIndex / totalLines:
Screen Shot 2021-02-18 at 7 19 29 PM

λ‚˜λŠ” λͺ¨λ“  데이터λ₯Ό μ΅œλŒ€ 3개의 μœ λ‹ˆνΌ + 2개의 μ†μ„±μœΌλ‘œ κ°€μ Έμ˜¬ 수 μžˆμ—ˆλŠ”λ°, μ΄λŠ” κ½€ μ’‹μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” μ—¬μ „νžˆ 그것듀을 μ„ νƒμ μœΌλ‘œ λ§Œλ“€κ³  μ‹Άλ‹€.

λͺ¨λ“  18 λŒ“κΈ€

λ˜ν•œ μ•„λ§ˆλ„ wordIndex , lineIndex ...?

단어와 쀄은 https://greensock.com/splittext/ 와 맀우 μœ μ‚¬ν•˜κ²Œ 쀄 및 단어당 μ• λ‹ˆλ©”μ΄μ…˜μ΄ ν™œμ„±ν™”λ©λ‹ˆλ‹€(이 변경이 ν™œμ„±ν™”ν•  수 μžˆλŠ” 쒋은 예λ₯Ό κ³ λ €ν•  수 있음).

이것이 ν”„λž˜κ·Έλ¨ΌνŠΈ μ…°μ΄λ”μ—μ„œ 토큰별(문자, 단어, 쀄) 변경도 ν—ˆμš©ν•œλ‹€κ³  κ°€μ •ν•˜λŠ” 것이 λ§žμŠ΅λ‹ˆκΉŒ?

이것이 ν”„λž˜κ·Έλ¨ΌνŠΈ μ…°μ΄λ”μ—μ„œ 토큰별(문자, 단어, 쀄) 변경도 ν—ˆμš©ν•œλ‹€κ³  κ°€μ •ν•˜λŠ” 것이 λ§žμŠ΅λ‹ˆκΉŒ?

κ°€λ³€μœΌλ‘œ μ •μ μ—μ„œ 쑰각으둜 전달해야 ν•˜μ§€λ§Œ κ·Έλ ‡μŠ΅λ‹ˆλ‹€. :)

μš°λ¦¬λŠ” 토끼꡴ μ•„λž˜λ‘œ...

λ‹€μŒ λͺ¨λ“  μΈλ±μŠ€μ— λŒ€ν•œ μš©λ„μ™€ 각 인덱슀의 총 개수λ₯Ό 생각할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • charIndex, totalChars
  • wordIndex, totalWords
  • lineIndex, totalLines
  • charInWordIndex, totalCharsInWord
  • charInLineIndex, totalCharsInLine
  • wordInLineIndex, totalWordsInLine

μš°λ¦¬λŠ” μ΄λŸ¬ν•œ λͺ¨λ“  μ˜΅νŠΈμΈμ„ λ§Œλ“€κ³  μš°λ¦¬κ°€ λ„μž…ν•˜λŠ” μƒˆλ‘œμš΄ glsl μ†μ„±μ˜ 수λ₯Ό μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ 슀마트 νŒ¨ν‚Ήμ„ μˆ˜ν–‰ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. 이 API에 λŒ€ν•΄ 더 생각해야 ν•©λ‹ˆλ‹€.

μ‚¬μš©μžκ°€ ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λ‘ μ„ νƒν•˜λ„λ‘ ν•  수 μžˆμœΌλ―€λ‘œ

{
split: { 단어: true, 문자: true, 쀄: true }
}

λ˜‘λ˜‘ν•œ 포μž₯을 ν•΄

이것에 λŒ€ν•΄ ν™•μž₯ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? κΆκΈˆν•΄μš” πŸ‘

μ‚¬μš©μžκ°€ 뢄할을 선택할 수 μžˆλ‹€λŠ” 아이디어가 λ§ˆμŒμ— λ“­λ‹ˆλ‹€.

νŒ¨ν‚Ήν•œλ‹€λŠ” 것은 12개의 μƒˆλ‘œμš΄ attribute float foo 선언을 μΆ”κ°€ν•˜κ³  싢지 μ•Šλ‹€λŠ” λœ»μž…λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ μ œν•œμ— λ„λ‹¬ν•˜κ²Œ λ©λ‹ˆλ‹€(webglμ—μ„œλŠ” 총 16개의 속성이라고 μƒκ°ν•©λ‹ˆλ‹€). ν•˜μ§€λ§Œ μ΅œλŒ€ 3개의 μƒˆλ‘œμš΄ μ„ μ–ΈμœΌλ‘œ νŒ¨ν‚Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€. attribute vec4 foo 선언을 ν•˜κ³  셰이더 λ‚΄μ—μ„œ 더 λ©‹μ§€κ²Œ λ³΄μ΄λŠ” float λ³€μˆ˜λ‘œ 압좕을 ν’‰λ‹ˆλ‹€.

였 예, λ§Žμ€ μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€!

charIndex 증뢄에 곡백을 포함해야 ν•©λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ λ³΄μ΄λŠ” κΈ€λ¦¬ν”„λ§Œ μ¦κ°€μ‹œν‚€λ‚˜μš”? λ‚˜λŠ” λ³΄μ΄λŠ” κΈ€λ¦¬ν”„μ—λ§Œ κΈ°λŒ€κ³  μžˆμŠ΅λ‹ˆλ‹€.

곡백을 μ„Έλ©΄ 인덱슀둜 μ• λ‹ˆλ©”μ΄μ…˜ν•  λ•Œ μ΄μƒν•œ 비틀거림을 λ§Œλ“€ 수 μžˆμœΌλ―€λ‘œ λ³΄μ΄λŠ” μͺ½μœΌλ‘œ κΈ°μšΈμ—ˆμŠ΅λ‹ˆλ‹€.

정리해야 ν•  것이 λ§Žμ§€λ§Œ μœ„μ˜ κ°œμˆ˜μ— λŒ€ν•œ 초기 POCκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ ν”„λž˜κ·Έλ¨ΌνŠΈ μ…°μ΄λ”μ—μ„œ 색상을 λ³€κ²½ν•˜κΈ° μœ„ν•΄ λ‹€μ–‘ν•œ 인덱슀/총 μŒμ„ μ‚¬μš©ν•˜λŠ” μ˜ˆμž…λ‹ˆλ‹€.

charIndex / totalChars:
Screen Shot 2021-02-18 at 7 18 56 PM

charInWordIndex / totalCharsInWord:
Screen Shot 2021-02-18 at 7 19 01 PM

charInLineIndex / totalCharsInLine:
Screen Shot 2021-02-18 at 7 19 08 PM

wordIndex / totalWords: (이 μ˜ˆμ—μ„œ charIndex/totalChars와 맀우 μœ μ‚¬ν•΄ λ³΄μ΄μ§€λ§Œ λ―Έλ¬˜ν•œ 차이가 μžˆμŠ΅λ‹ˆλ‹€)
Screen Shot 2021-02-18 at 7 19 16 PM

wordInLineIndex / totalWordsInLine:
Screen Shot 2021-02-18 at 7 19 22 PM

lineIndex / totalLines:
Screen Shot 2021-02-18 at 7 19 29 PM

λ‚˜λŠ” λͺ¨λ“  데이터λ₯Ό μ΅œλŒ€ 3개의 μœ λ‹ˆνΌ + 2개의 μ†μ„±μœΌλ‘œ κ°€μ Έμ˜¬ 수 μžˆμ—ˆλŠ”λ°, μ΄λŠ” κ½€ μ’‹μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” μ—¬μ „νžˆ 그것듀을 μ„ νƒμ μœΌλ‘œ λ§Œλ“€κ³  μ‹Άλ‹€.

λ†€λΌμš΄! ν…ŒμŠ€νŠΈ 버전이 μ€€λΉ„λ˜λ©΄ μ•Œλ €μ£Όμ„Έμš” πŸ˜„

이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” κΈ°λŠ₯을 μ°Ύκ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€. ꡬ μ£Όμœ„μ— 뢙일 3 κΈ€μž λ ˆμ΄λΈ”μ΄ μžˆμŠ΅λ‹ˆλ‹€. λ·° λ§€νŠΈλ¦­μŠ€λ‚˜ λͺ¨λΈλ§ λ§€νŠΈλ¦­μŠ€μ— 적용된 μŠ€μΌ€μΌλ§μ— 상관없이 항상 λ·°μ–΄λ₯Ό ν–₯ν•˜λ„λ‘ μ‘°μ •ν•˜κ³  ν™”λ©΄μ—μ„œ 항상 λ™μΌν•œ 크기가 λ˜λ„λ‘ μ‘°μ •ν•©λ‹ˆλ‹€.
μ§€κΈˆμ€ λ ˆμ΄λΈ”λ‹Ή ν•˜λ‚˜μ˜ Text 개체λ₯Ό λ§Œλ“€κ³  λ³€ν™˜μ„ μ μš©ν•©λ‹ˆλ‹€.
λͺ¨λ“  λ ˆμ΄λΈ”μ„ 단일 ν…μŠ€νŠΈλ‘œ 포μž₯ν•˜κ³  정점 μ…°μ΄λ”μ—μ„œ μ˜¬λ°”λ₯Έ λ³€ν™˜μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ 각 λ ˆμ΄λΈ”μ˜ ꡬ에 μœ„μΉ˜λ₯Ό κ°–λŠ” 속성을 κ°€μ§μœΌλ‘œμ¨ 훨씬 더 λ‚˜μ€ μ„±λŠ₯을 얻을 수 μžˆλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.
@lojjic μ‚¬μš©μž 지정 셰이더λ₯Ό λ§Œλ“œλŠ” 방법을 λ¬Έμ„œν™”ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? BufferGeometry 의 κΈ°μ‘΄ λ©”μ†Œλ“œ setAttribute 처럼 속성을 μΆ”κ°€ν•˜λŠ” 것은 어렡지 μ•Šμ„ 것이라고 μƒκ°ν•©λ‹ˆλ‹€.

λ‚΄κ°€ κ³ λ €ν•˜κ³  있던 λ‹€λ₯Έ μ˜΅μ…˜μ€ λͺ¨λ“  λ ˆμ΄λΈ”μ— 3개의 κΈ€μžκ°€ 있기 λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€ λ Œλ”λ§μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 그것은 ν™•μ‹€νžˆ WebGL 2λ₯Ό ν•„μš”λ‘œ ν•  것이고 적어도 μ²˜μŒμ—λŠ” κ°€μΉ˜κ°€ μžˆκΈ°μ—λŠ” λ„ˆλ¬΄ λ³΅μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@FunMiles λ‚˜λŠ” 당신이 μ˜³λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 이것은 그런 μ’…λ₯˜μ˜ 일을 μš©μ΄ν•˜κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ μ˜¬λ°”λ₯΄κ²Œ μ΄ν•΄ν•˜κ³  μžˆλ‹€λ©΄ μ΅œμ ν™”μ—λŠ” 두 뢀뢄이 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. CPU μΈ‘ JSμ—μ„œ GPU μΈ‘ 정점 셰이더 λ…Όλ¦¬λ‘œ νšŒμ „/크기 μ‘°μ • 논리 이동
  2. μ—¬λŸ¬ ν…μŠ€νŠΈ 쑰각을 단일 그리기 호좜둜 κ²°ν•©ν•˜λŠ” _plus_

1의 경우 이 의견 을 μ‚΄νŽ΄λ³΄μ‹­μ‹œμ˜€. μ‹€μ œλ‘œ 이미 κ·€ν•˜μ˜ μš”κ΅¬μ— μΆ©λΆ„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 기본적으둜 material 둜 μ§€μ •ν•˜λŠ” μ»€μŠ€ν…€ 셰이더λ₯Ό μ μš©ν•˜λŠ” 방법에 λŒ€ν•œ 쒋은 데λͺ¨μ΄κΈ°λ„ ν•©λ‹ˆλ‹€. 거기에 Troika의 createDerivedMaterial μœ ν‹Έλ¦¬ν‹°λ₯Ό μ‚¬μš©ν–ˆμ§€λ§Œ ShaderMaterial λ˜λŠ” 자체 onBeforeCompile μˆ˜μ •μ΄ μžˆλŠ” 재료λ₯Ό μœ μ‚¬ν•˜κ²Œ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

2의 경우 단일 ν…μŠ€νŠΈλ₯Ό λ Œλ”λ§ν•œ λ‹€μŒ _some_ 속성을 μ‚¬μš©ν•˜μ—¬ ꡬ체 μ£Όμœ„μ˜ κ°œλ³„ 문자λ₯Ό λŒ€μ²΄ν•  수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 이번 ν˜Έμ—μ„œ μ„€λͺ…ν•˜λŠ” μƒˆλ‘œμš΄ 문자/단어 인덱슀 속성이 도움이 될 수 μžˆμ§€λ§Œ κΌ­ ν•„μš”ν•œμ§€ 확신이 μ„œμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ³€μœ„λ₯Ό μƒˆλ‘œμš΄ InstancedBufferAttribute둜 인코딩할 수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œ 각 λ²‘ν„°λŠ” ν•œ λ¬Έμžμ— λŒ€ν•œ λ³€μœ„λ₯Ό λ³΄μœ ν•©λ‹ˆλ‹€(ν…μŠ€νŠΈμ˜ κΈ°ν•˜ν•™μ€ 각 글리프에 λŒ€ν•΄ μΈμŠ€ν„΄μŠ€ν™”λ˜λŠ” κ°„λ‹¨ν•œ μΏΌλ“œμ΄λ―€λ‘œ 각 글리프에 λŒ€ν•΄ μΆ”κ°€ InstancedBufferAttributesκ°€ λ‹¨κ³„μ μœΌλ‘œ μ§„ν–‰λ©λ‹ˆλ‹€).

λ‚˜λŠ” 당신이 μ΄κ²ƒμ„ν•˜λŠ” 데 운이 μžˆλŠ”μ§€ μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€!

@lojjic μ˜¬λ°”λ₯΄κ²Œ μ΄ν•΄ν–ˆμŠ΅λ‹ˆλ‹€. 그리고 λ§ν¬ν•œ μ½”λ“œλŠ” (1)에 ν•„μš”ν•œ κ²ƒμ˜ 90%λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. κ·€ν•˜μ˜ 데λͺ¨λŠ” 제 μ‚¬μš© 사둀와 λ¬˜ν•˜κ²Œ μΌμΉ˜ν•©λ‹ˆλ‹€.
λ‚΄ 이해λ₯Ό μˆ˜μ •ν•˜λ„λ‘ μš”μ²­ν•  수 μžˆλŠ” 경우 λ‹€μŒμ€ 당신이 ν•˜λŠ” 일을 λ³΄λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

  • mvPosition λŠ” λͺ¨λΈ λ·° κ³΅κ°„μ˜ 기쀀점 μœ„μΉ˜λ‘œ μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€. λ‚˜λŠ” κ·Έ 기쀀점이 기쀀점이라고 κ°€μ •ν•œλ‹€. λ§žλ‚˜μš”?
  • position λŠ” ν•΄λ‹Ή μ°Έμ‘°μ μœΌλ‘œλΆ€ν„°μ˜ μ˜€ν”„μ…‹μ΄λ©° x 및 yκ°€ 0이 μ•„λ‹Œ μ’Œν‘œλ§Œ μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€. (κ·Έλž˜μ„œ μŠ€μΌ€μΌμ˜ z ꡬ성 μš”μ†Œ 계산을 κ±΄λ„ˆλ›Έ 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆκΉŒ?) (μΆ”μ‹ : μΈμŠ€ν„΄μŠ€ν™”λœ λ Œλ”λ§ 정점 셰이더 μ½”λ“œλ₯Ό 보면 ν…μŠ€νŠΈλ₯Ό νšŒμ „ν•  수 μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 이 경우 z ꡬ성 μš”μ†ŒλŠ” 0이 μ•„λ‹™λ‹ˆλ‹€)
  • 각 λ°©ν–₯의 μŠ€μΌ€μΌμ€ 3x3 블둝이 μŠ€μΌ€μΌλ§κ³Ό νšŒμ „μ˜ κ΅¬μ„±λ§Œ ν¬ν•¨ν•œλ‹€λŠ” κ°€μ • ν•˜μ— λ³΅κ΅¬λ©λ‹ˆλ‹€.
  • μΆ•μ²™λœ 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 이 μ–ΈκΈ‰ν–ˆλ“―μ΄ 단어에 μ•½κ°„μ˜ 경계가 ν•„μš”ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ˜λŠ” 적어도 λ‚΄κ°€ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 각 λ‹¨μ–΄μ˜ 쀑심.
λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ μˆ˜ν–‰ν•˜λŠ” λ°©λ²•μ΄λ‚˜ ν•΄λ‹Ή μ„Όν„°λ₯Ό μ–»λŠ” 방법에 λŒ€ν•œ λ‹€λ₯Έ μ œμ•ˆμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

https://flightlog-beta.vercel.app/circles?route=BRU-HER-ATH-IST-AMM-CAI-TUN-CMN-RAK-MAD-LIS-ZRH-GVA-NCE-CDG-DUS-FRA- MUC-LHR-LCY-LGW-DUB-HBA-SYD-MEL-CNS-KTM-DEL-BLR-COK-MAA-CMB-MLE-HKG-HND-NRT-KIX-ICN-GMP-MNL-DPS-JOG- CGK-SIN-KUL-PEN-LGK-BKK-SGN-HAN-LPQ-CNX-DOH-AUH-DXB-JNB-CPT-LVI-ZNZ-JRO-DAR-SSH-BUD-OTP-IPC-SCL-PMC- GRU-EZE-GIG-BSB-LIM-LPB-BOG-PTY-SJO-SJU-CUN-ACA-MEX-MTY-JFK-BOS-PHL-DCA-IAD-BWI-CLT-ATL-MSP-MIA-DFW- DTW-ORD-IAH-COS-DEN-PHX-SAN-LAX-SJC-SFO-SEA-PDX-YVR-YYZ-YUL-LGA-EWR-ASP-BNE-AKL-CHC-ZQN-VIE-SJJ-VCE- MXP-FCO-BCN-PEK-PVG-HNL-OGG-KOA-HIJ-RGN-PBH-TIP-AMS-CPH-SLC-CVG-GSP-TPE-ULN-PNH-VTE-ABQ-BUF-MCO-HKT- MDL-

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰