推荐一款强大的 Android OpenGL ES 调试工具

简介: GAPID (Graphics API Debugger)是 Google 的一款开源且跨平台的图形开发调试工具,用于记录和检查应用程序对图形驱动程序的调用,支持 OpenGL ES 和 Vulkan 调试。

作者:字节流动

来源: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 脚本。

ok.gif

上图来自 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 掉了。

image.png

打开 GAPID 程序,点击 Capture a new trace 准备调试我们的程序。

image.png

选择要调试的程序,选中接口类型为 OpenGL ES类型,然后启动抓取 Graphics Trace 信息。

image.png

抓取完成后,打开 trace 文件,然后 GAPID 程序的界面如下图所示。

image.png

左侧区域为抓取到的每一帧的绘制过程,区域 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


「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。

阿里云社区.png

相关文章
|
18天前
|
传感器 监控 Linux
Android i2cdetect i2cdump i2cget i2cset调试工具使用
Android i2cdetect i2cdump i2cget i2cset调试工具使用
11 0
|
18天前
|
Java Android开发
Android开发之使用OpenGL实现翻书动画
本文讲述了如何使用OpenGL实现更平滑、逼真的电子书翻页动画,以解决传统贝塞尔曲线方法存在的卡顿和阴影问题。作者分享了一个改造后的外国代码示例,提供了从前往后和从后往前的翻页效果动图。文章附带了`GlTurnActivity`的Java代码片段,展示如何加载和显示书籍图片。完整工程代码可在作者的GitHub找到:https://github.com/aqi00/note/tree/master/ExmOpenGL。
42 1
Android开发之使用OpenGL实现翻书动画
|
18天前
|
Android开发 开发者
Android开发之OpenGL的画笔工具GL10
这篇文章简述了OpenGL通过GL10进行三维图形绘制,强调颜色取值范围为0.0到1.0,背景和画笔颜色设置方法;介绍了三维坐标系及与之相关的旋转、平移和缩放操作;最后探讨了坐标矩阵变换,包括设置绘图区域、调整镜头参数和改变观测方位。示例代码展示了如何使用这些方法创建简单的三维立方体。
23 1
Android开发之OpenGL的画笔工具GL10
|
18天前
|
前端开发 API vr&ar
Android开发之OpenGL绘制三维图形的流程
即将连载的系列文章将探索Android上的OpenGL开发,这是一种用于创建3D图形和动画的技术。OpenGL是跨平台的图形库,Android已集成其API。文章以2D绘图为例,解释了OpenGL的3个核心元素:GLSurfaceView(对应View)、GLSurfaceView.Renderer(类似Canvas)和GL10(类似Paint)。通过将这些结合,Android能实现3D图形渲染。文章介绍了Renderer接口的三个方法,分别对应2D绘图的构造、测量布局和绘制过程。示例代码展示了如何在布局中添加GLSurfaceView并注册渲染器。
74 1
Android开发之OpenGL绘制三维图形的流程
|
18天前
|
XML 小程序 Java
【Android App】三维投影OpenGL ES的讲解及着色器实现(附源码和演示 超详细)
【Android App】三维投影OpenGL ES的讲解及着色器实现(附源码和演示 超详细)
61 0
|
18天前
|
XML 前端开发 Java
【Android App】三维处理中三维投影OpenGL功能的讲解及实战(附源码和演示 超详细必看)
【Android App】三维处理中三维投影OpenGL功能的讲解及实战(附源码和演示 超详细必看)
38 1
|
18天前
|
XML Java Android开发
Android App开发中OpenGL三维投影的讲解及实现(附源码和演示 简单易懂)
Android App开发中OpenGL三维投影的讲解及实现(附源码和演示 简单易懂)
41 1
|
12月前
|
Shell Linux Android开发
Android强大的原生调试工具adb的常用命令
Android强大的原生调试工具adb的常用命令
|
存储 编解码 算法
Opengl ES之LUT滤镜(上)
Opengl ES之连载系列
350 0
|
数据安全/隐私保护 开发者
OpenGL ES 多目标渲染(MRT)
Opengl ES连载系列
229 0