【问题标题】:Is there a way to pass a diagnostic message out of an OpenGL 2.0 ES shader on Android?有没有办法从 Android 上的 OpenGL 2.0 ES 着色器中传递诊断消息?
【发布时间】:2013-08-03 23:14:51
【问题描述】:

这个问题专门针对 Android 上的 OpenGL 2.0 ES,但如果有更多基于 OpenGL 规范的通用答案,我也会对此感兴趣。

有没有办法将消息(字符串)从 GL 2.0 ES 着色器传递到应用程序代码(Java 或本机)?例如

void main()
{
   ...
   if (somecondition)
   {
       logMessage("Things are messed up man");
   }
}

如果不是,为什么要在没有这种设施的情况下定义编程环境(在这种情况下为 OpenGL ES 2.0 着色器语言)?我对硬件一无所知,但在 GPU 中实现这肯定不会那么难。如果存在性能问题,则始终可以选择将 #ifdef 从着色器代码中删除...

【问题讨论】:

  • Nicol,你能告诉我你为什么拒绝我吗?

标签: android opengl-es opengl-es-2.0


【解决方案1】:

不,在任何 OpenGL 着色语言(包括 OpenGL ES)中都没有您要求的日志记录工具。桌面 OpenGL 上的调试上下文(以及当它们到达那里时在 ES 中)可能会提供一些信息,但没有什么比得上你所要求的。

最常见的技术(这通常在片段着色器的上下文中完成)是将着色器的输出设置为错误颜色,或其他指示着色器失败的信号。 /p>

鉴于特定着色器的许多实例同时执行(想想填充全屏四边形时执行了多少片段着色器线程),跟踪每个线程的状态将需要大量状态才能正确完成工作。

你说:

我对硬件一无所知,但在 GPU 中实现这肯定不会那么难。

没有;现代 GPU 是具有复杂设计的复杂机器。虽然这样做是可能的,但不值得额外的复杂性和硬件验证。这就是 API 的魔力,虽然类似的东西在概念上看起来很简单,但实际上并非如此。

【讨论】:

  • 感谢您的完整回答。我没有想到着色器每帧运行多次,并且同时运行的事实。我对这一切都很陌生:)。也许解决这个问题的一种方法是定义日志记录函数,这样只有每帧的第一次调用才能真正做任何事情。这样,它对于证明逻辑上永远不会发生的错误条件的诊断很有用......
  • 请原谅我迂腐,但这是我的天性。我说实现这一点“不会那么难”,现在我撤回了,因为我真的不知道我在说什么:)。但是我仍然不知道可以说绝对不值得增加额外的复杂性。实现这个的成本(额外的复杂性等,就像你说的那样)可能是任意高的,但它是有限的。因此,如果调试的价值足够高,这将是一个值得权衡的选择。
  • @DavidStone 不客气。的确,你是对的;这是可能的,这是应用程序开发人员经常要求的。然而,这是一个很难解决的问题(本质上,它是在调试一个大规模线程的程序,这对 CPU 来说也很困难),而且它对硬件管道的影响可能会很麻烦。大多数现代 GPU(甚至在移动设备中)并行执行多个线程,并依赖于大多数线程同时执行接近相同的事情。调试或提前终止确实会影响性能。只是继续很好地要求它:-)
【解决方案2】:

radical7 的答案是正确的。

如果您想调试着色器代码,GPU 供应商会提供编译器和模拟器。或者您可以尝试glm library 并使用 C++ 编写着色器,并使用所有工具来打印您需要的消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多