39

在 C 中,我可以调试如下代码:

fprintf(stderr, "blah: %f", some_var);

在 GLSL 中......无论如何我都可以在顶点或片段着色器中转储一个值吗?我不在乎它是否很慢;我只是想抛弃价值。理想情况下,我想要如下设置:

  • 正常状态 = 正常运行 GLSL 着色器
  • press key 'd' = 下一帧在ULTRA慢速模式下生成,其中 Vertex/Fragment 着色器中的“printfs”被执行并转储出去。

这可行吗?(我不关心性能;我只想为一帧执行此操作)。

谢谢!

4

4 回答 4

25

不幸的是,这不可能直接。不过,一种可能的解决方案是,我最终使用了很多(但我确信这在 GLSL 开发人员中很常见)是将值“打​​印”为颜色,以代替您预期的最终结果。

当然,这有很多限制;一方面,您必须确保您的值映射在一个(0,1.0)范围内。在这些情况下,函数 as 等变得很有mod用。fract但是,总的来说,这就是我在 GLSL 中看到的“printf”等价物。

于 2011-06-23T13:25:06.607 回答
21

您是否想过尝试使用 GLSL 调试器,而不是打印值?

例如,glslDevil将让您逐步执行着色器并检查每一步的变量。

于 2010-08-06T02:20:01.167 回答
4

查看 AMD CodeXL。它将让您逐帧检查 opengl 状态值、着色器代码和纹理内存。

http://developer.amd.com/tools-and-sdks/heterogeneous-computing/codexl/

于 2013-07-23T18:40:51.707 回答
-3

您可以通过将其值复制到制服中来查看要检查的变量,然后使用glGetUniformfv

于 2013-01-14T14:52:04.170 回答