Troika: 機胜文字/単語/行のむンデックス属性をテキストゞオメトリに远加したす

䜜成日 2021幎02月11日  Â·  18コメント  Â·  ゜ヌス: protectwise/troika

テキストむンスタンスにカスタムシェヌダヌを適甚するず、非垞に優れたアニメヌション効果が埗られる可胜性がありたす。 これらの倚くでは、各文字/グリフを個別に凊理する必芁がありたす。そのためには、珟圚レンダリングされおいる文字を瀺すシェヌダヌ内の䜕かが必芁です。

グリフクワッドにむンスタンス化を䜿甚するため、理論的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/のように、行ごずおよび単語ごずのアニメヌションで有効になりたすこれは、この倉曎によっお有効になる良い䟋ず芋なすこずができたす

これにより、フラグメントシェヌダヌでトヌクンごずchar、word、lineの倉曎も可胜になるず思いたすか

これにより、フラグメントシェヌダヌでトヌクンごずchar、word、lineの倉曎も可胜になるず思いたすか

頂点からフラグメントに倉化ずしお枡す必芁がありたすが、そうです。 :)

うさぎの穎を䞋りお行きたす...

次のすべおのむンデックスの甚途ず、それぞれの合蚈数を考えるこずができたす。

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

これらすべおをオプトむンし、スマヌトパッキングを実行しお、導入する新しいglsl属性の数を最小限に抑えたいず考えおいたす。 このためのAPIに぀いおもっず考える必芁がありたす。

ナヌザヌにフラグを付けおそれらすべおを遞択させるこずができるので、

{{
分割{単語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文字のラベルがたくさんありたす。 ビュヌマトリックスたたはモデリングマトリックスに適甚されるスケヌリングに関係なく、画面䞊で垞に同じサむズになるように、垞にビュヌアに面しお調敎を行いたす。
珟圚、ラベルごずに1぀のTextオブゞェクトを䜜成し、倉換を適甚しおいたす。
すべおのラベルを1぀のテキストにパックし、頂点シェヌダヌで正しい倉換を行うために各ラベルの球䞊の䜍眮を持぀属性を持぀こずで、はるかに優れたパフォヌマンスを埗るこずができるず考えおいたした。
@lojjicカスタムシェヌダヌを䜜成する方法を文曞化できたすか BufferGeometryの既存のメ゜ッドsetAttributeが行うように、属性を远加するこずは難しくないず思いたす。

私が怜蚎しおいた他のオプションは、すべおのラベルが3文字であるため、むンスタンス化されたレンダリングです。 しかし、それには確かにWebGL 2が必芁であり、少なくずも最初は耇雑すぎお䟡倀がない可胜性がありたす。

@FunMilesあなたが正しいず思いたす、これはその皮のこずを容易にするかもしれたせん。 私がそれを正しく理解しおいる堎合、最適化には2぀の郚分が含たれる可胜性がありたす。

  1. 回転/スケヌリングロゞックをCPU偎のJSからGPU偎の頂点シェヌダヌロゞックに移動する
  2. その_plus_は耇数のテキストを1぀の描画呌び出しに結合したす

1に぀いおは、このコメントを芋おください。これは、実際にはすでにニヌズに十分である可胜性がありたす。 これは、カスタムシェヌダヌを適甚する方法の良いデモンストレヌションでもあり、基本的にはmaterialずしお割り圓おるだけです。 そこでTroikaのcreateDerivedMaterialナヌティリティを䜿甚したしたが、同様に、任意のShaderMaterialたたは独自のonBeforeCompile倉曎を加えたマテリアルを枡すこずができたす。

2の堎合、1぀のテキストをレンダリングしおから、_some_属性を䜿甚しお、球の呚りの個々の文字を移動できるのは正しいず思いたす。 この号で説明されおいる新しいchar/wordむンデックス属性は圹立぀かもしれたせんが、それらが必芁かどうかさえわかりたせん。 おそらく、これらの倉䜍を新しいInstancedBufferAttributeに゚ンコヌドするこずができたす。ここで、各ベクトルは1぀の文字の倉䜍を保持したすテキストのゞオメトリは、各グリフに察しおむンスタンス化される単玔なクワッドであるため、远加のInstancedBufferAttributesは各グリフに察しおステップスルヌされたす。

これをやっお運が良かったかどうか興味がありたす

@lojjicあなたは正しく理解したした。 そしお、あなたがリンクしたコヌドは、私が必芁ずするものの90を実行したす1。 あなたのデモは私のナヌスケヌスず䞍気味に䞀臎しおいたす。
私の理解を正すように頌むかもしれたせんが、これがあなたがしおいるこずを私がどのように芋るかです

  • mvPositionは、モデルビュヌ空間の参照点の䜍眮で初期化されたす。 その基準点がアンカヌポむントだず思いたす。 そうですか
  • positionはその参照点からのオフセットであり、xずyの非れロ座暙しかないず思いたす。 これにより、スケヌルのzコンポヌネントの蚈算をスキップできるず思いたすかPSむンスタンス化されたレンダリング頂点シェヌダヌコヌドを芋るず、テキストを回転できるようです。この堎合、zコンポヌネントはれロになりたせん
  • 各方向のスケヌルは、3x3ブロックにスケヌリングず回転の構成のみが含たれおいるず仮定しお埩元されたす。
  • スケヌリングされ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が蚀ったように、私は蚀葉にいく぀かの限界が必芁だず思いたす。 たたは、少なくずも、私の䜿甚では、各単語の䞭心です。
それ以倖の方法でそれを行う方法やそのセンタヌを取埗する方法に関する他の提案はありたすか

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 評䟡