如何调试 OpenGL 着色器?例如。:
void main(void)
{
vec2 uv = gl_FragCoord.xy;
gl_FragColor = vec4(uv,222,1);
}
有没有办法可以找出 uv 值是多少?
调试着色器的方法有很多种,大多数方法是可视化的,而不是输出整个图像的完整像素数据。
由于着色器以高度并行的方式运行,您可以一次输出大量视觉数据。
还有一些外部应用程序可以帮助您调试 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 为 vec2(1.0,1.0),黑色表示 vec2(0.0,0.0)。
另一个可视化调试示例:( 来源:https ://www.shadertoy.com/view/ts2yzK )
这个来自一个 raymarching 项目。在这张图片中有两件事,我调试光线的深度并调试是否有命中。
这张图片可以查看您是否击中了什么,因为白色意味着命中,黑色意味着未命中。
另一方面,该图像不利于显示图像的深度。由于两件事,您可能很难调试像这样的图像:
像这样的值将我们引向另一种类型的调试
Renderdoc 是目前最好的调试器之一。是的,还有很多其他的,但这个是免费的,用途非常广泛。
您可以通过查看着色器之前和之后来调试顶点 glsl 着色器。您可以看到片段着色器的每个像素以及那里的值。
您还可以查看如何将数据存储在 GPU 上以及更多内容。
在调试时,无论是否可视化,您都必须知道要查找的内容,至少您会成功。可视化调试是最难调试的事情之一,因为由于着色器的高并行性,通常无法逐步执行代码。
许多错误也是因为我们忘记了一些小事情,比如标准化一个值、忘记一个减号和更多的小事情。
要发现错误并正确调试,您必须彻底并耐心等待。