我需要调试一个GLSL程序,但我不知道如何输出中间结果。 是否有可能使用GLSL进行一些调试跟踪(如printf) ?
当前回答
我发现变换反馈是调试顶点着色器的有用工具。您可以使用它来捕获VS输出的值,并在CPU端读取它们,而不必通过光栅化器。
这里是另一个转换反馈教程的链接。
其他回答
你不能轻易地从GLSL内部与CPU通信。使用glslDevil或其他工具是最好的选择。
printf需要尝试从运行GLSL代码的GPU返回到CPU。相反,你可以试着推到显示器前。不要尝试输出文本,而是输出一些在屏幕上有视觉区别的东西。例如,只有当您到达代码中想要添加printf的位置时,才可以将某些东西涂成特定的颜色。如果你需要打印一个值,你可以根据这个值设置颜色。
我正在分享一个片段着色器的例子,我实际上是如何调试的。
#version 410 core
uniform sampler2D samp;
in VS_OUT
{
vec4 color;
vec2 texcoord;
} fs_in;
out vec4 color;
void main(void)
{
vec4 sampColor;
if( texture2D(samp, fs_in.texcoord).x > 0.8f) //Check if Color contains red
sampColor = vec4(1.0f, 1.0f, 1.0f, 1.0f); //If yes, set it to white
else
sampColor = texture2D(samp, fs_in.texcoord); //else sample from original
color = sampColor;
}
GLSL Shader源代码由图形驱动程序编译和链接,并在GPU上执行。 如果你想调试着色器,那么你必须使用图形调试器,如RenderDoc或NVIDIA Nsight。
对纹理进行离线渲染,并评估纹理的数据。 你可以通过google“render to texture”opengl找到相关代码 然后使用glReadPixels将输出读入数组并对其执行断言(因为在调试器中查看如此巨大的数组通常并不真正有用)。
此外,你可能想要禁用钳制输出值不是在0到1之间,这只支持浮点纹理。
我个人一度被调试着色器的问题所困扰。似乎没有一个好的方法-如果有人发现一个好的(并且没有过时/过时)调试器,请告诉我。
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;
}
推荐文章
- 如何调试一个GLSL着色器?
- 漂亮地打印Java集合(toString不返回漂亮输出)
- 确定导致分段错误的代码行?
- 如何在GDB中打印c++向量的元素?
- 在Clojure中调试?
- 为什么Android工作室说“等待调试器”如果我不调试?
- 没有找到用于调试模式的此可执行文件的有效配置文件
- Visual Studio c++和Windows中的调试内存填充模式是什么?
- 为什么这个for循环在某些平台上退出,而在其他平台上不退出?
- 在OpenGL中如何将原语渲染为线框?
- 如何使gdb保存命令历史?
- 如何检查Flutter应用程序是否正在调试中运行?
- 如何设置断点在内联Javascript在谷歌Chrome?
- Chrome调试-打破下一个点击事件
- PHP -调试Curl