天天看點

推薦一款強大的 Android OpenGL ES 調試工具GAPID 是什麼?GAPID 怎麼用?

作者:位元組流動

來源:

https://blog.csdn.net/Kennethdroid/article/details/106695602

GAPID 是什麼?

GAPID (Graphics API Debugger)是 Google 的一款開源且跨平台的圖形開發調試工具,用于記錄和檢查應用程式對圖形驅動程式的調用,支援 OpenGL ES 和 Vulkan 調試。

工具下載下傳位址:

https://github.com/google/gapid/releases

GAPID 的主要功能:

  • 檢視 OpenGL ES 或 Vulkan 繪圖接口的調用情況(調用順序、流程);
  • 檢視傳入着色器程式的參數;
  • 檢視紋理,導出模型、貼圖等資源;
  • 檢視、修改以及導出 shader 腳本。
推薦一款強大的 Android OpenGL ES 調試工具GAPID 是什麼?GAPID 怎麼用?

上圖來自 GAPID 官網,我們可以看到一個 3D 場景的整個渲染過程,以及每次渲染用到的紋理圖。很多朋友看到這裡,心裡可能會有疑問:假如我看上了别人的一個 OpenGL 實作的效果,那我能不能用 GAPID 抓取到它的 shader 腳本源碼來學習?答案是肯定的。

編譯完 shader 腳本生成的二進制代碼,可以通過 GAPID 抓取到并反編譯成原來的 shader 源碼。總而言之就是,你的 shader 腳本實際上是在 GPU 上裸奔,尤其是對手機廠商來說。

據俺所知,shader 腳本在 GPU 層面上目前并沒有有效的加密或混淆方法,比較通用的做法是将 shader 中的變量無意義化,比如用 var1、var2 等表示,或者将一個 shader 拆分成多個小 shader ,以達到降低可讀性的目的。

GAPID 怎麼用?

下載下傳、安裝好 GAPID 程式後,将 Android 手機通過 USB 與電腦連接配接(同時需要關閉 AndroidStudio ),手機處于開發者選項中的 Debug 調試模式。注意, GAPID 支援 Android 5.0 及以上版本手機,待調試的 App 要求是 Debug 版本或者手機被 Root 掉了。

推薦一款強大的 Android OpenGL ES 調試工具GAPID 是什麼?GAPID 怎麼用?

打開 GAPID 程式,點選

Capture a new trace

準備調試我們的程式。

推薦一款強大的 Android OpenGL ES 調試工具GAPID 是什麼?GAPID 怎麼用?

選擇要調試的程式,選中接口類型為

OpenGL ES

類型,然後啟動抓取 Graphics Trace 資訊。

推薦一款強大的 Android OpenGL ES 調試工具GAPID 是什麼?GAPID 怎麼用?

抓取完成後,打開 trace 檔案,然後 GAPID 程式的界面如下圖所示。

推薦一款強大的 Android OpenGL ES 調試工具GAPID 是什麼?GAPID 怎麼用?

左側區域為抓取到的每一幀的繪制過程,區域 1 中展示的是其中一幀繪制過程,由于我們用的是舊文中繪制水波紋的例子作為調試程式,可以對比出區域 1 中展示的繪制流程與下面繪制水波紋的代碼基本一緻。

void ShockWaveSample::Draw(int screenW, int screenH)
{
    glUseProgram (m_ProgramObj);
    glBindVertexArray(m_VaoId);
    GLUtils::setMat4(m_ProgramObj, "u_MVPMatrix", m_MVPMatrix);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, m_TextureId);
    GLUtils::setFloat(m_ProgramObj, "s_TextureMap", 0);
    //float time = static_cast<float>(fmod(GetSysCurrentTime(), 2000) / 2000);
    float time = static_cast<float>(fmod(m_FrameIndex, 150) / 120);
    GLUtils::setFloat(m_ProgramObj, "u_Time", time);
    GLUtils::setVec2(m_ProgramObj, "u_TouchXY", m_touchXY);
    GLUtils::setVec2(m_ProgramObj, "u_TexSize", vec2(m_RenderImage.width, m_RenderImage.height));
    GLUtils::setFloat(m_ProgramObj, "u_Boundary", 0.1f);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (const void *)0);
}      

區域 2 中展示的是繪制目前幀時,傳遞給着色器程式中各個變量的值,可以清楚看到各個變量和矩陣對應的值。

區域 3 中展示的是着色器程式的狀态資訊,我們根據着色器程式的 id ,找到對應的 LinkExtra ,然後便可以拿到目前着色器程式所對應的 shader 腳本源碼,與代碼中的程式一緻。

本文主要介紹了 GAPID 的一些常用功能,還有更多高端功能等你探索。

實作代碼路徑:

Android_OpenGLES_3_0
「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。
推薦一款強大的 Android OpenGL ES 調試工具GAPID 是什麼?GAPID 怎麼用?

繼續閱讀