6

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

void main(void)
{
    vec2 uv = gl_FragCoord.xy;
    gl_FragColor = vec4(uv,222,1);
}

有没有办法可以找出 uv 值是多少?

4

1 回答 1

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);
}

uv 范围从 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 上以及更多内容。


最后注意

在调试时,无论是否可视化,您都必须知道要查找的内容,至少您会成功。可视化调试是最难调试的事情之一,因为由于着色器的高并行性,通常无法逐步执行代码。

许多错误也是因为我们忘记了一些小事情,比如标准化一个值、忘记一个减号和更多的小事情。

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

于 2022-02-23T13:07:08.837 回答