GLSL中的printf?

GLSL中的printf?,glsl,Glsl,在C中,我可以调试如下代码: fprintf(stderr, "blah: %f", some_var); 在GLSL中。。。我是否需要在顶点或片段着色器中转储一个值?我不在乎它是否慢;我只想把这个值倒出来。理想情况下,我需要如下设置: 正常状态=正常运行GLSL着色器 按键“d”=在超慢速模式下生成下一帧,其中 顶点/片段着色器将执行并转储 这是否可行?(我不关心性能;我只想为一帧执行此操作) 谢谢 您是否想过尝试GLSL调试器而不是打印值 例如,将允许您逐步执行着色器,并在每个步骤检查

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

fprintf(stderr, "blah: %f", some_var);
在GLSL中。。。我是否需要在顶点或片段着色器中转储一个值?我不在乎它是否慢;我只想把这个值倒出来。理想情况下,我需要如下设置:

  • 正常状态=正常运行GLSL着色器
  • 按键“d”=在超慢速模式下生成下一帧,其中 顶点/片段着色器将执行并转储
这是否可行?(我不关心性能;我只想为一帧执行此操作)


谢谢

您是否想过尝试GLSL调试器而不是打印值


例如,将允许您逐步执行着色器,并在每个步骤检查变量。

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


当然,这有很多局限性;首先,您必须确保您的值映射在
(0,1.0)
范围内。在这些情况下,
mod
fract
等功能非常有用。但是,一般来说,这就是我在GLSL中看到的“printf”等价物。

您可以通过在统一格式中复制其值来查看要检查的变量,然后使用
glGetUniformfv

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


是的。计算机很适合这种情况。例如,许多向量(例如,法线、眼睛、光)是三分量。这些可以输出到红色、绿色和蓝色通道。通过令人惊讶的少量练习,这种方式“看到”向量是直观的。即使使用调试器,也无法以这种方式可视化向量!根据规范,统一变量是只读的,并且在所有处理的顶点/片段中具有相同的值。您不能在着色器中更改它们,而实际希望glGetUniform检索新指定的值!这个答案是不正确的。从着色器透视图来看,一致性是只读值。通常由硬件供应商通过读取常量寄存器(默认块统一)或常量缓冲区(统一块)来实现。但是,最新的OpenGL版本(ES3.1/GL4.2,4.3)引入了着色器图像加载和存储、着色器原子和着色器存储缓冲区。这些是可写的。另外,在发出适当的屏障后,它们当前的存储空间可以从CPU上看到。Upvote,是的,AMD CodeXL非常适合这种情况,它还有许多其他功能,比如GPU调试,这对任何开发人员来说都是非常有价值的。链接已经死了:替代链接?@Pica它似乎已经被转移到