如何调试GLSL着色器?

Fra*_*ger 179 opengl debugging glsl

我需要调试一个GLSL程序,但我不知道如何输出中间结果.是否可以使用GLSL制作一些调试跟踪(如printf)?

Mr.*_*rna 109

您无法轻松地从GLSL内部与CPU通信.使用glslDevil或其他工具是最好的选择.

printf需要尝试从运行GLSL代码的GPU返回CPU.相反,您可以尝试推进显示.而不是尝试输出文本,输出视觉上与屏幕不同的东西.例如,只有当您到达要添加printf的代码点时,才能绘制特定颜色的内容.如果需要printf值,可以根据该值设置颜色.

  • 如果您想要调试着色器的确切原因是因为屏幕上没有出现任何内容,该怎么办? (45认同)
  • 你为什么要调试任何东西?因为它的代码和他想检查运行时间值我会危险.... (10认同)
  • 我是否应该制作整个文本渲染算法只是为了检查一些运行时值? (9认同)
  • [GLSL-Debugger](http://glsl-debugger.github.io/)是glslDevil的开源分支. (3认同)

ste*_*e3e 55

void main(){
  float bug=0.0;
  vec3 tile=texture2D(colMap, coords.st).xyz;
  vec4 col=vec4(tile, 1.0);

  if(something) bug=1.0;

  col.x+=bug;

  gl_FragColor=col;
}
Run Code Online (Sandbox Code Playgroud)

  • 它是一个调试设备.如果您想知道场景中灯光位置的位置,例如,请转到:if(lpos.x> 100)bug = 1.0.如果灯光位置大于100,场景将变为红色. (8认同)

nul*_*ace 12

我发现变换反馈是调试顶点着色器的有用工具.您可以使用它来捕获VS输出的​​值,并在CPU端读回它们,而无需通过光栅化器.

是关于变换反馈的教程的另一个链接.


wip*_*wip 8

如果你想要在屏幕上可视化值的变化,你可以使用类似于此的热图函数(我在hlsl中编写它,但它很容易适应glsl):

float4 HeatMapColor(float value, float minValue, float maxValue)
{
    #define HEATMAP_COLORS_COUNT 6
    float4 colors[HEATMAP_COLORS_COUNT] =
    {
        float4(0.32, 0.00, 0.32, 1.00),
        float4(0.00, 0.00, 1.00, 1.00),
        float4(0.00, 1.00, 0.00, 1.00),
        float4(1.00, 1.00, 0.00, 1.00),
        float4(1.00, 0.60, 0.00, 1.00),
        float4(1.00, 0.00, 0.00, 1.00),
    };
    float ratio=(HEATMAP_COLORS_COUNT-1.0)*saturate((value-minValue)/(maxValue-minValue));
    float indexMin=floor(ratio);
    float indexMax=min(indexMin+1,HEATMAP_COLORS_COUNT-1);
    return lerp(colors[indexMin], colors[indexMax], ratio-indexMin);
}
Run Code Online (Sandbox Code Playgroud)

然后在你的像素着色器中输出如下内容:

return HeatMapColor(myValue, 0.00, 50.00);
Run Code Online (Sandbox Code Playgroud)

并且可以了解它在像素中的变化:

在此输入图像描述

当然,您可以使用任何您喜欢的颜色.

  • 非常好......除了问题是“如何调试着色器”......但除此之外非常好。 (2认同)

Nic*_*aux 6

对于着色器,GLSL Sandbox对我来说非常方便.

不调试本身(已被回答为无能为力),但很方便快速查看输出的变化.


Ian*_*osh 6

您可以试试这个:https : //github.com/msqrt/shader-printf,这是一个适当地称为“GLSL 的简单 printf 功能”的实现。

您可能还想尝试 ShaderToy,并且可以从“代码的艺术”YouTube 频道观看这样的视频 ( https://youtu.be/EBrAdahFtuo ),您可以在其中看到一些适用于调试和可视化。我强烈推荐他的频道,因为他写了一些非常好的东西,而且他还擅长以新颖、引人入胜且易于理解的格式呈现复杂的想法(他的 Mandelbrot 视频就是一个很好的例子:https:// youtu.be/6IWXkV82oyY )

我希望没有人介意这个迟到的回复,但这个问题在 GLSL 调试的谷歌搜索中排名靠前,当然 9 年来发生了很多变化:-)

PS:其他替代品也可以是 NVIDIA nSight 和 AMD ShaderAnalyzer,它们为着色器提供完整的步进调试器。