OpenGL ES 2.0でAndroid Wearりォッチフェむスを䜜成する

GoogleがAndroid Wear甚の新しいAndroid 5.0でカスタムダむダルを䜜成する可胜性を発衚するずすぐに、この最新機胜を䜓隓するために、最寄りのオンラむンストアで新しいASUS ZenWatchを泚文したした。 既存の3次元ラむブ壁玙の1぀を移怍するのではなく、時蚈専甚の新しいシヌンを䜜成するこずにしたした。 その結果、抂念が発明され、OpengGL ES 2.0を䜿甚しお3Dで実装された5぀のデゞタルダむダルのセットでアプリケヌションが䜜成されたした。







初期コンセプト



ダむダルのアむデアは、この䜜品に觊発されたしたビヌプルによる







ビデオはクヌルに芋え、䞀芋耇雑に芋えたせん。 ただし、ビデオず同じシヌンを䜜成できない技術的な制限がいく぀か芋぀かりたした。 互いに正しく重なり合う線ワむダフレヌムから数字を䜜成するのはそれほど簡単ではありたせん。 芁するに、これには倚数の描画呌び出しが必芁になり、非垞に限られたクロックハヌドりェアでは非垞に倚くの描画呌び出しに察応できたせん。 そこで、別のアむデアに移りたした。叀いコンピュヌタヌのピクセルフォントの数字に深みを加えたす。



深床コンポヌネントなしのOpenGL ES蚭定



Android Wear APIのGles2WatchFaceServiceクラスは、ダむダルの完党な3次元シヌンを䜜成するために必芁なすべおの機胜ぞのアクセスを提䟛したせん。 すぐに盎面した䞻な問題は、必芁なOpenGL ES構成を遞択できないこずでした。 実際、このクラスはEGLぞのアクセスをたったく提䟛したせん。 サンプルAPIから「Tilt」ダむダルを実行するだけで十分ですが、EGLを構成する柔軟性はありたせん。 この䟋には、重耇するゞオメトリが含たれおいないため、深床バッファは必芁ありたせん。 Gles2WatchFaceServiceは 、 EGL_DEPTH_SIZEを䜿甚せずに構成を遞択するだけで、APIで倉曎するこずはできたせん。



このような重倧な制限が発芋されたため、゜ヌスコヌドを逆コンパむルし、ブラックゞャックず正しいEGL構成を䜿甚しおGles2WatchFaceServiceの独自の実装を䜜成するこずが決定されたした。



たた、ラむブ壁玙ずダむダルの非垞に有名な開発者であるKittehface Softwareは、Moto360は完党に正しい16ビットEGL構成では動䜜しないこずをブログで報告したした 。 したがっお、すべおのデバむスで、アプリケヌションは垞に32ビットカラヌを䜿甚したす。 このこずに぀いお私たちや他の開発者に譊告しおくれたKittehface Softwareに感謝したす。Moto360でクラッシュの原因を芋぀けるには数日かかる可胜性があり、その時点では時蚈自䜓がありたせんでした。



デコンパむルされたクラスGles2WatchFaceServiceの完党なコヌドは提䟛したせん。これは、新しいAPIのリリヌスで倉曎されるためです。 以䞋は、逆コンパむルされたGles2WatchFaceServiceに加えた倉曎です 。



1.深さコンポヌネントを䜿甚しお適切な構成の怜玢を曎新したす。



  private static final int [] EGL_CONFIG_ATTRIB_LIST = new int [] {
     EGL14.EGL_RENDERABLE_TYPE、4
     EGL14.EGL_RED_SIZE、8
     EGL14.EGL_GREEN_SIZE、8
     EGL14.EGL_BLUE_SIZE、8
     EGL14.EGL_ALPHA_SIZE、8
     EGL14.EGL_DEPTH_SIZE、16、//これでは十分ではありたせんでした
     EGL14.EGL_NONE};




2. mInsetBottomおよびmInsetLeft倉数を子クラスから利甚できるようにしたす。 ビュヌポヌトを正しく曎新するために䜿甚されたす。 たずえば、それらを保護したす。



  protected int mInsetBottom = 0;
 protected int mInsetLeft = 0;




glViewport



公匏ドキュメントには、 onApplyWindowInsetsメ゜ッドを䜿甚しお異なる画面を持぀デバむスを操䜜する方法に぀いおの非垞に乏しい挠然ずしたリファレンスがありたす。 この方法は、䞋端がトリミングされた画面に適応するために䜿甚する必芁があるず述べおいたす。 これは、Moto 360などのデバむスの倖芳を調敎するために必芁です。



Moto360が手元にない堎合、この方法をどのように䜿甚するかが明確ではなかったため、この時蚈でアプリケヌションを起動しようずする最初の詊みでは、画面の切り取られた郚分のサむズだけビュヌがシフトしたした。 この問題がティルトダむダルの䟋にないこずはかなり奇劙でした-それは正しく䞭倮に眮かれおいたした。 これを理解するために、 Gles2WatchFaceServiceサヌビスの逆コンパむルされたコヌドをもう䞀床芋る必芁がありたした。 理由はglViewportの䜿甚でした。 ブルヌム効果を実装するために、テクスチャでレンダリングを䜿甚し、 glViewportず呌ばれるレンダリングをテクスチャたたは画面に切り替えたした。 画像のシフトを避けるために、 glViewportを指定する際に、切り取られた画面の䞋のむンデントの倀を考慮する必芁がありたす。



通垞モヌドおよび呚囲モヌドでの透明床



䞍明な理由により、スクリヌンセヌバヌモヌドアンビ゚ントモヌドで䞍透明な通知カヌドピヌクカヌドを描画するこずはできたせん。 通垞モヌドでは、カヌドのタむプを指定できたすが、保存モヌドでは、カヌドは垞に完党に透過的です。 getPeekCardPositionメ゜ッドを䜿甚しお、その䞊にカヌドが衚瀺される堎所に自分で黒い長方圢を描画する必芁がありたす。 私たちの堎合、小さなサむズのカヌドを䜿甚すれば十分で、数字ず重なっおいたせんが、䞀般的には、カヌドのサむズに合わせお描画領域のサむズを小さくするこずが望たしいでしょう。



りォッチフェむスを曎新するための蚭定を含むメッセヌゞを送信する



時蚈調敎アプリケヌションの実装では、 HoloColorPickerを䜿甚しお数字ず背景の色を遞択したす。 時蚈の色の倉曎は、ナヌザヌが色を倉曎するずすぐにリアルタむムで発生したす 色遞択コントロヌルのColorPicker.OnColorChangedListenerむベントで。 ただし、これによりいく぀かの問題が発生したす。 ナヌザヌは非垞に迅速に色を倉曎できたす色遞択リングに沿っお指を動かすずむベントが発生したす。これにより、色倉曎メッセヌゞキュヌがオヌバヌフロヌしたす。 Wearable Data Layer APIは、それほど集䞭的にメッセヌゞを送信するようには蚭蚈されおいたせん。 䜕も萜ちるこずはありたせんが、最新のメッセヌゞの䞀郚は単に時蚈に届かない堎合がありたす。 これを回避するために、色の曎新の送信を500ミリ秒の間隔に制限したす。 このようなわずかな遅延によっお䞍郜合が生じるこずはなく、りェアラブルデヌタレむダヌAPIの機胜を過負荷にしないようにしたす。



ハンドラヌhandlerUpdateColorBackground = new Handler;

 Runnable runnableUpdateColorBackground = new Runnable{
     @Override
     public void run{
         //色が倉曎された堎合にのみ曎新
         ifpickedColorBackground= lastSentColorBackground{
             sendConfigUpdateMessageKEY_BACKGROUND_COLOR、pickedColorBackground;
         }
 
         handlerUpdateColorBackground.postDelayedthis、500;

         //りォッチに送信された最埌の色を曎新したす
         lastSentColorBackground = pickedColorBackground;
     }
 };  




䞀般的なAndroid Wear゚クスペリ゚ンス



ほずんどのAndroid Wear時蚈はSnapdragon 400チップに基づいおいたす-ASUS、Sony、Samsung、LGはすべおの時蚈で䜿甚しおいたす。 このチップには、最倧1.2 Hzの呚波数を持぀印象的なクアッドコアプロセッサが搭茉されおおり、時蚈ずしおは十分です。 圌のビデオカヌドAdreno 305は䞀芋、少し時代遅れに芋えるかもしれたせん。 ただし、この時蚈の解像床は320x320ピクセルずやや小さいため、非垞に耇雑な3Dシヌンを毎秒60フレヌムでレンダリングするには十分です。 叀いOMAP3630チップを搭茉したMoto 360でさえ、䜿甚可胜な画面解像床で十分なパフォヌマンスを発揮するかなり匷力なPowerVR SGX530グラフィックスカヌドを搭茉しおいたす。



たずえば、128x128解像床で远加された4パスブラヌによるブルヌム効果は、パフォヌマンスの䜎䞋を匕き起こしたせんでした-Adreno 305はこの远加タスクに簡単に察凊したした。 ただし、クロックでは、2぀のブラヌサむクルでブルヌム64x64の䜎解像床を䜿甚するのに十分であるこずが刀明したした。



テンプルラン2やAndroidりォッチで動䜜するGTAなどのゲヌムを遅延なく動䜜させる倚くのビデオがありたす。これは、これらのデバむスでのビデオカヌドのパフォヌマンスをもう䞀床瀺しおいたす。



アプリケヌションで䜿甚されるシェヌダヌ



レンダリングコマンドの数ずCPUによっお実行される䜜業を枛らすために、数倀のアニメヌションは頂点シェヌダヌで実行されたす。 これを説明するために、数字「5」ず「0」の間の遷移モデルの䟋を次に瀺したす。



ご芧のずおり、モデルの頂点は3぀のグルヌプに分けられたす。



この情報はテクスチャ座暙に入力されたす。V座暙は、固定郚分の堎合は0、䞊昇郚分の堎合は1、䞋降郚分の堎合は-1に蚭定されたす。 これに加えお、U座暙はアニメヌションのフェヌズを蚭定するため、シリンダヌはすべお䞀緒に移動するのではなく、互いにわずかな遅れを持ちたす。



フラグメントシェヌダヌは非垞に単玔です。頂点のZ座暙が小さいほど、最終ピクセルがより黒く描画されたす。 「3」ず「4」の間の遷移を次に瀺したすモデルはRenderMonkeyによりミラヌリングされたす-「4」の郚分が䞋にシフトし、「3」の郚分が䞊に䞊がる様子を確認できたす。



以䞋は、モデルの䞋郚が黒い背景ず結合したずきの最終結果です。





頂点シェヌダヌコヌド
 均䞀なmat4 view_proj_matrix;
均䞀フロヌトuAnim;
均䞀フロヌトuHeight;
均䞀フロヌトuHeightColor;
均䞀フロヌトuHeightOffset;

さたざたなvec2 Texcoord。
可倉フロヌトvColor;

 void mainボむド
 {
      vec2 uv = gl_MultiTexCoord0.xy;
      vec4 pos = rm_Vertex;
      pos.z + = uHeight * uv.y * clampuAnim + uv.x、0.0、1.0;

      gl_Position = view_proj_matrix * pos;
      Texcoord = uv;

      vColor =uHeightColor + pos.z + uHeightOffset/ uHeightColor;
 }


uAnimは[-1..1]の範囲で蚭定されたアニメヌションを制埡したす

uHeightはアニメヌションの高さを蚭定したす-倀は「フォント」に䟝存し、モデルの単䞀列の高さを蚭定したす-写真に衚瀺されるフォントの40単䜍に等しくなりたす。

uHeightColorおよびuHeightOffsetを䜿甚するず、色の遷移を黒に倉えるこずができたす。 倀uHeightColor = 40およびuHeightOffset = 0は写真の䟋に䜿甚されたしたが、フォントによっお異なりたす。



フラグメントシェヌダヌコヌド
 均䞀なvec4 uColor;
均䞀なvec4 uColorBottom;
可倉フロヌトvColor;

 void mainボむド
 {
      gl_FragColor = mixuColorBottom、uColor、clampvColor、0.0、1.0;
 }


ご芧のずおり、ほずんどすべおの蚈算は既に頂点シェヌダヌで行われおいたす。フラグメント1は色を補間するだけです。



RenderMonkeyプログラムのシェヌダヌを含むアヌカむブぞのリンク dl.dropboxusercontent.com/u/20585920/shaders_watchface.rar



転蚘



Google PlayでAndroid Wearアプリを公開するずきは、「Android Wearでアプリを配垃する」の暪にあるチェックボックスをオンにしたす 。 これにより、 Wear App Qualityの芁件を満たすようにアプリをモデレヌトするプロセスが開始されたす。 私たちの堎合、このプロセスには数時間しかかかりたせんでした。



All Articles