如何在OS X上调试GLSL着色器?

new*_*cle 6 debugging shader glsl

如何调试OpenGL着色器?例如.:

void main(void)
{
    vec2 uv = gl_FragCoord.xy;
    gl_FragColor = vec4(uv,222,1);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让我知道紫外线的价值是多少?

Cew*_*ein 0

调试 GLSL 着色器


调试着色器的方法有很多,大多数方法都是视觉的,而不是输出整个图像的完整像素数据。

由于着色器以高度并行的方式运行,因此您可以一次输出大量视觉数据。

还有一些外部应用程序可以帮助您调试 glsl 着色器以及整个渲染管道。


可视化调试

这是最简单的调试形式,但最难理解结果。您只需将您想要看到的数据输出到屏幕上,例如知道您想要的 uv 值是多少。

你可以这样做:

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.xy;

    // Output to screen
    fragColor = vec4(uv, 0.0 ,1.0);
}
Run Code Online (Sandbox Code Playgroud)

紫外线范围从 0 到 1

在此图中,您可以看到归一化 uv 的范围为 0 到 1。黄色平均 uv 为 vec2(1.0,1.0),黑色平均 vec2(0.0,0.0)。

可视化调试的另一个示例:在此输入图像描述 (来源: https: //www.shadertoy.com/view/ts2yzK

这是来自 Raymarching 项目。该图像中有两件事,一是我调试光线的深度,二是调试是否有命中。

该图像可以查看您击中或未击中的内容,因为白色表示击中,黑色表示未击中。

另一方面,该图像不利于显示图像的深度。由于以下两点,您可能很难调试这样的图像:

  • 负值谁渲染黑色
  • 呈现白色的值优于 1.0

这样的值引导我们进行另一种类型的调试


外用

https://renderdoc.org/

Renderdoc 是最好的调试器之一。是的,还有很多其他的,但是这个是免费使用的,并且用途非常广泛。

您可以通过查看着色器之前和之后来调试顶点 glsl 着色器。您可以看到片段着色器的每个像素及其值。

您还可以查看如何在 GPU 上存储数据以及更多内容。


末尾注释

在调试时,无论是否可视化,您都必须知道自己在寻找什么,至少您会找到答案。可视化调试是最难调试的事情之一,因为由于着色器的高度并行性,通常无法逐步执行代码。

许多错误也是因为我们忘记了一些小事情,例如规范化值、忘记负号等等小事情。

要发现错误并正确调试,您必须彻底且耐心。