Fra*_*ger 179 opengl debugging glsl
我需要调试一个GLSL程序,但我不知道如何输出中间结果.是否可以使用GLSL制作一些调试跟踪(如printf)?
Mr.*_*rna 109
您无法轻松地从GLSL内部与CPU通信.使用glslDevil或其他工具是最好的选择.
printf需要尝试从运行GLSL代码的GPU返回CPU.相反,您可以尝试推进显示.而不是尝试输出文本,输出视觉上与屏幕不同的东西.例如,只有当您到达要添加printf的代码点时,才能绘制特定颜色的内容.如果需要printf值,可以根据该值设置颜色.
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)
如果你想要在屏幕上可视化值的变化,你可以使用类似于此的热图函数(我在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)
并且可以了解它在像素中的变化:
当然,您可以使用任何您喜欢的颜色.
您可以试试这个: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,它们为着色器提供完整的步进调试器。