【问题标题】:What causes GLSL recompilation of vertex shader based on state?是什么导致基于状态的顶点着色器的 GLSL 重新编译?
【发布时间】:2019-08-12 02:01:02
【问题描述】:

我正在使用 GL_ARB_debug_output 扩展。司机给了我这个警告:

程序/着色器状态性能警告:程序 16 中的顶点着色器正在根据 GL 状态重新编译。

所以,我尝试在编译着色器之前设置各种 GL 状态,包括:

GL_BLEND, GL_CULL_FACE, GL_DEPTH_TEST, 多边形偏移, 和 blendfunc。

但它仍然会在第一次绘制时重新编译。

可能导致驱动程序重新编译顶点着色器的典型状态有哪些?

【问题讨论】:

  • "但它仍然会在第一次绘制时重新编译。" 你是什么意思“在第一次绘制时”?这是您第一次使用该着色器进行渲染吗? “我在编译我的着色器之前尝试设置各种 GL 状态” 没有着色器编译器/链接器会假设编译/链接时的 OpenGL 状态准确地反映了将出现的 OpenGL 状态使用时间。所以真的没关系。
  • 是的,第一次渲染。我想避免当时重新编译。如果编译时的状态与渲染时的状态相同,我希望驱动程序不会重新编译。
  • "如果编译时的状态与渲染时的状态相同,我希望驱动程序不会重新编译。" 你不应该这样。驱动程序编写者当然不会期望它,所以你也不应该。
  • @NicolBolas 不过,那些相同的“驱动程序编写者”也发出了性能警告。如果无法避免重新编译,则警告毫无意义。

标签: opengl glsl vertex-shader


【解决方案1】:

我最近遇到了这个问题。发生解除绑定顶点数组对象导致出现此警告。删除带有glBindVertexArray(0) 的行后,警告消息消失了。

【讨论】:

  • 为什么这样可以修复错误?我在根据 Cherno 的教程重构我的着色器代码后遇到了它。该错误是从 OpenGL 4.3 的调试消息回调系统触发的。此外,如果您在绘图前调用glUseProgram(0),错误也会消失,因此您不需要删除带有glBindVertexArray(0)的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
相关资源
最近更新 更多