AndroidアプリをWebGLに移怍する

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ラむセンスの䞋でプロゞェクトで䜿甚できたす。



All Articles