着色器加载和编译时出现“无效操作”

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 一个加载着色器文件,编译和链接到着色器程序的函数。

损坏的顶点和片段着色器

如何为 SceneKit 预编译 PBR 着色器?

将 CSV 文件从 S3 加载到 Snowflake 时出现 SQL 编译错误

OpenGL Cg 几何着色器