2010-08-06 63 views
32

在C,我可以调试类似的代码:printf in GLSL?

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

在GLSL ......反正是有,我刚刚倾倒出来的顶点或片段着色器的值?我不在乎它是否缓慢;我只是想抛弃价值。理想情况下,我想像的设置如下:

  • 正常状态=运行GLSL着色器通常
  • 按键“d” =下一帧中ULTRA低速模式下,产生其中在所述“printfs输出” 顶点/片段着色器被执行并转出。

这可行吗? (我不关心表现,我只是想为一帧做这件事)。

谢谢!

+1

参见[在GLSL转换浮点数到十进制数字?](https://stackoverflow.com/questions/44793883/convert-floating-point-numbers-to-decimal-digits-in -Glsl/44810859#44810859) – Rabbid76 2017-07-02 19:07:25

回答

21

而不是打印值,你有没有想过尝试一个GLSL调试器?

例如,glslDevil可让您逐步完成着色器的执行并检查每个步骤的变量。

+0

+1对于glslDevil从来没有听说过这个 – 2012-05-30 15:12:40

+0

链接已死:Alternative Link? – Pica 2017-03-04 10:47:34

+2

@Pica它似乎已经分叉到https://github.com/GLSL-Debugger/GLSL-Debugger – 2017-03-07 18:47:12

20

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

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

+4

是的。计算机可以很好地满足这一点。例如,许多矢量(例如,正常,眼睛,光)是三个分量。这些可以输出到红色,绿色和蓝色通道。由于练习数量少得令人惊讶,因此以这种方式“观察”向量是直观的。你不能用这种方式来显示矢量 - 即使是用调试器! – imallett 2012-08-15 09:26:53

-2

你可以看到你想要在一个统一的复制其值来检查,然后拿到均匀,glGetUniformfv

+8

根据规范,统一变量是只读的,并且在所有处理的顶点/片段中具有相同的值。你可以*不*在着色器中改变它们,并且实际上期望glGetUniform检索新分配的值! – 2013-06-28 19:29:51

+5

这个答案是错误的。从着色器角度来看,制服是只读值。通常由硬件供应商通过读取常量寄存器(默认块统一)或恒定缓冲区(统一块)来实现。然而,最新的OpenGL版本(ES3.1/GL4.2,4.3)引入了着色器映像加载和存储,着色器原子和着色器存储缓冲区。这些着色器是可写的。而且,在发布适当的屏障后,它们当前的存储空间可以从CPU中看到。 – sacygan 2014-07-30 23:03:38