GLSL中的printf?

ano*_*non 36 glsl

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

fprintf(stderr, "blah: %f", some_var);
Run Code Online (Sandbox Code Playgroud)

在GLSL中......无论如何我只是在Vertex或Fragment着色器中转储一个值?我不在乎它是否缓慢; 我只想转出价值.理想情况下,我想要一个如下设置:

  • normal state =正常运行GLSL着色器
  • 按键'd'=在ULTRA慢速模式下生成下一帧,其中Vertex/Fragment着色器中的"printfs"被执行并转出.

这可行吗?(我不关心性能;我只是想为一帧做这个).

谢谢!

Unc*_*eiv 23

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

当然这有很多局限性; 首先,您必须确保您的值映射到一个(0,1.0)范围内.在这些情况下mod,函数as fract等变得有用.但是,一般来说,这就是我在GLSL中看到的"printf"等价物.

  • 是.计算机非常适合这一点.例如,许多矢量(例如,正常,眼睛,光)是三个分量.这些可以输出到红色,绿色和蓝色通道.通过极少量的练习,以这种方式"看到"向量是直观的.您不能以这种方式可视化矢量 - 即使使用调试器! (6认同)

Joh*_*ess 21

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

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

  • @Pica好像已经分到了https://github.com/GLSL-Debugger/GLSL-Debugger (2认同)