着色器加载和编译时出现“无效操作”
Posted
技术标签:
【中文标题】着色器加载和编译时出现“无效操作”【英文标题】:"invalid operation" on shader loading and compiling 【发布时间】:2015-03-30 19:56:07 【问题描述】:问题
在a.vs
中有一个着色器程序:
#version 330
in vec2 vPosition;
void main()
gl_Position = vec4(vPosition, 0.0, 1.0);
并给出:
import qualified Graphics.GLUtil as GLU
import qualified Graphics.Rendering.OpenGL as GL
这一行:
vs <- GLU.loadShader GL.VertexShader $ shaderPath </> "a.vs"
原因:
GL:错误 InvalidOperation “无效操作”
在运行时。
详情
我在 Mac OS X 10.10.2 上运行。 OpenGL 上下文是通过 GLFW 设置的:
GLFW.windowHint $ GLFW.WindowHint'OpenGLDebugContext True
GLFW.windowHint $ GLFW.WindowHint'ContextVersionMajor 3
GLFW.windowHint $ GLFW.WindowHint'ContextVersionMinor 3
GLFW.windowHint $ GLFW.WindowHint'OpenGLForwardCompat True
GLFW.windowHint $ GLFW.WindowHint'OpenGLProfile GLFW.OpenGLProfile'Core
提供 OpenGL 3.3 上下文。
代码的上下文可以在这个repository(指向特定提交的链接)中找到,特别是在Main.hs
。
问题
如何解决此问题或获取更多调试信息?
【问题讨论】:
在你做你的事情之前,请确保 OpenGL 没有处于错误状态。已知某些扩展加载程序包装器(获取 3.3 功能所必需的)会使 OpenGL 处于错误状态,必须将其清除,以免自欺欺人。 【参考方案1】:我在 gDebugger 下运行了你的代码,结果很简单:
GL.matrixMode $= GL.Projection
GL.loadIdentity
GL.ortho2D 0 (realToFrac w) (realToFrac h) 0
这段剩余的代码触发了错误状态:
错误代码:
GL_INVALID_OPERATION
错误描述: 当前状态不允许指定的操作。有问题的函数被忽略,除了设置错误标志外没有任何副作用。
附带说明,着色器编译永远不会触发INVALID_OPERATION
(除非您尝试使用损坏的管道进行渲染);编译错误可以通过直接查看编译状态得到。
【讨论】:
以上是关于着色器加载和编译时出现“无效操作”的主要内容,如果未能解决你的问题,请参考以下文章
C#程序在VS编译器加载时出现找不到方法,无法显示该程序窗体设计器
c_cpp 一个加载着色器文件,编译和链接到着色器程序的函数。