【问题标题】:how to purge opengl shader cache如何清除opengl着色器缓存
【发布时间】:2017-01-26 06:16:41
【问题描述】:

当前的 opengl 驱动程序使用位于 c:/users/name/appdata/roaming/amd|nvidia/glcache/...

不幸的是,几乎每次我更改一些着色器时它都会导致程序崩溃,我目前通过手动删除着色器缓存来解决这个问题。

问题是,当我发布新版本的程序时,有什么好的方法可以清除缓存吗?任何控制缓存的opengl扩展?或者来自操作系统的一些神奇的api?或者,至少,找到文件夹的正确方法?

另一个问题:驱动程序使用什么键来识别单个着色器?这样我就可以在每次更改着色器时以某种方式更改密钥。

【问题讨论】:

    标签: c++ winapi opengl caching shader


    【解决方案1】:

    不幸的是,几乎每次我更改一些着色器时它都会导致程序崩溃,我目前通过手动删除着色器缓存来解决这个问题。

    如果发生这种情况,则说明您的系统和/或驱动程序安装存在严重问题。这一定不能发生,如果发生了,那么它就不是 OpenGL 程序应该关心的事情了。

    另一个问题:驱动程序使用什么键来识别单个着色器?

    通常从着色器源 AST 派生一些哈希(即,仅添加空格或重命名符号不会起到作用)。

    问题是,当我发布新版本的程序时,有什么好的方法可以清除缓存吗?

    我不知道。着色器是 OpenGL 规范中的“黑匣子”。您发送 GLSL 源文本,它会被编译和链接,仅此而已。诸如着色器缓存或内部表示之类的东西不是由 OpenGL 指定的。

    任何控制缓存的opengl扩展?

    不。从技术上讲,供应商可以为此添加特定于供应商的扩展,但没有人这样做。

    还是来自操作系统的一些神奇的 api?

    没有任何官方规定。

    或者,至少,找到文件夹的正确方法?

    同样没有正确说明这一点。

    【讨论】:

    • 它发生在我的电脑 (amd gpu) 和我朋友的电脑 (nvidia) 上,还有一个。因此我认为它与操作系统或驱动程序无关。如果这不是一个常见问题,正如您所说,那会让我在着色器加载/编译/链接代码中遇到问题,对吧?我会广泛检查任何错误,我还使用调试上下文和错误回调集对其进行测试,并且没有错误。你接下来有什么建议?我应该编辑问题并添加加载代码吗?
    • @Tomas:是的,查看着色器加载代码会有所帮助。程序崩溃状态的回溯也将有所帮助:在调试模式下编译并使用调试器运行。 Visual Studio 提供了一个堆栈跟踪窗口,在 GDB 中您可以使用“backtrace”命令。您不会看到驱动程序中发生了什么,但您可以看到您的程序采取了哪些步骤导致了崩溃。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2023-02-06
    相关资源
    最近更新 更多