Opengl 是什么导致GLSL基于状态重新编译顶点着色器?
我使用的是GL\u ARB\u debug\u输出扩展。司机警告我: 程序/着色器状态性能警告:正在根据GL状态重新编译程序16中的顶点着色器。 因此,在编译着色器之前,我尝试设置各种GL状态,包括: GL_混合物, GL_CULL_面, GL\U深度测试, 多边形偏移, 还有blendfunc 但它仍然在第一次绘制时重新编译Opengl 是什么导致GLSL基于状态重新编译顶点着色器?,opengl,glsl,vertex-shader,Opengl,Glsl,Vertex Shader,我使用的是GL\u ARB\u debug\u输出扩展。司机警告我: 程序/着色器状态性能警告:正在根据GL状态重新编译程序16中的顶点着色器。 因此,在编译着色器之前,我尝试设置各种GL状态,包括: GL_混合物, GL_CULL_面, GL\U深度测试, 多边形偏移, 还有blendfunc 但它仍然在第一次绘制时重新编译 哪些典型的状态会导致驱动程序重新编译顶点着色器?我最近遇到了这个问题。取消绑定顶点阵列对象时,会出现此警告。删除带有glBindVertexArray(0)的行后,警告消
哪些典型的状态会导致驱动程序重新编译顶点着色器?我最近遇到了这个问题。取消绑定顶点阵列对象时,会出现此警告。删除带有
glBindVertexArray(0)
的行后,警告消息消失。“但它在第一次绘制时仍会重新编译。“第一次绘制时”是什么意思?”?这是您第一次使用该着色器进行渲染吗?“我尝试在编译着色器之前设置各种GL状态”没有着色器编译器/链接器会假设编译/链接时的OpenGL状态准确反映使用时将出现的OpenGL状态。所以这真的不重要。是的,首先渲染。我想避免在那个时候重新编译。如果编译时的状态与渲染时的状态相同,我希望驱动程序不会重新编译。“如果编译时的状态与渲染时的状态相同,我希望驱动程序不会重新编译。”你不应该这么想。驱动程序编写者当然不希望这样,所以你也不应该这样做。@NicolBolas那些同样的“驱动程序编写者”也在性能警告中加入了。如果无法避免重新编译,则警告毫无意义。为什么要修复错误?我在根据Cherno的教程重构着色器代码后遇到了它。该错误是从OpenGL 4.3的调试消息回调系统触发的。此外,如果在绘图之前调用glUseProgram(0)
,则错误也会消失,因此不需要使用glBindVertexArray(0)
删除该行。