- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关于OpenGL的学习,我指的是openglbook .目前在 chapter 2 ,我正在尝试运行其代码 pasted here供引用。
我面临的问题是以下功能:
void CreateShaders(void)
{
GLenum ErrorCheckValue = glGetError();
VertexShaderId = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(VertexShaderId, 1, &VertexShader, NULL);
glCompileShader(VertexShaderId);
FragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(FragmentShaderId, 1, &FragmentShader, NULL);
glCompileShader(FragmentShaderId);
ProgramId = glCreateProgram();
glAttachShader(ProgramId, VertexShaderId);
glAttachShader(ProgramId, FragmentShaderId);
glLinkProgram(ProgramId);
glUseProgram(ProgramId);
ErrorCheckValue = glGetError(); // =====> returns GL_INVALID_OPERATION
if (ErrorCheckValue != GL_NO_ERROR)
{
fprintf(
stderr,
"ERROR: Could not create the shaders: %s \n",
gluErrorString(ErrorCheckValue)
);
exit(-1);
}
}
如上函数(glew.h
)所示,为什么会返回"GL_INVALID_OPERATION"
?
如果我评论这些行,那么它会工作但只会打印一个空白窗口。
这是我的 glxinfo .由于我的版本是 2.2,而此代码适用于 3.3+,因此我删除了以下代码以避免失败:
glutInitContextVersion(4, 0);
glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);
glutInitContextProfile(GLUT_CORE_PROFILE);
更新:按照@Tim的回答建议,我成功运行了程序;这些行似乎是创建问题:
"#version 400\n" (replaced with "#version 130")
和
layout(location=0) (removed). layout(location=1) (removed).
然而,由于这个原因,预期的三角形打印不完全相同。可能该教程在教学时考虑了最新的 opengl 版本,但我没有,这会产生问题。
有什么方法可以在不改变输出的情况下将代码从最新的 OpenGL (4.0+) 兼容代码修改为较低版本(例如 < 3.0)?我将无法升级图形硬件。
最佳答案
您没有对着色器编译和链接进行正确的错误检查。您的着色器中可能存在某种语法错误,导致无法编译,因此您的 useProgram 调用尝试使用无效程序。
对于每个着色器,在调用 glCompileShader
之后,您需要调用 glGetShaderiv(shader, GL_COMPILE_STATUS, compile_status)
返回一个 true
或false
in compile_status 告诉你编译是否成功。如果不是,您可以调用 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, length)
获取 infoLog 的大小,然后调用 glGetShaderInfoLog()
获取一个字符串,它告诉你在编译过程中发生的任何错误。
总而言之,编译器/链接器错误检查应该是这样的:
void CheckError (GLuint shaderId, uint LINE)
{
GLint bCompiled;
glGetShaderiv(shaderId, GL_COMPILE_STATUS, &bCompiled);
if(bCompiled == false)
{
GLint length;
glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &length);
GLchar *pInfo = new GLchar[length + 1];
glGetShaderInfoLog(shaderId, length, &length, pInfo);
fprintf(stderr, "called at line-%u: Compiler/Linker error: %s", LINE, pInfo);
delete[] pInfo;
}
}
如果两个着色器都编译成功,那么在链接程序之后,您想使用 glGetProgramiv/GL_LINK_STATUS
和 glGetProgramInfoLog
在程序对象上测试同样的事情
关于c - OpenGL(在 Ubuntu 中): glGetError() returns GL_INVALID_OPERATION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12311158/
每次我尝试使用 Qt QOpenGLTexture 上传具有多个 mipmap 级别的 DXT1 纹理时,我都会收到 GL_INVALID_OPERATION。对于 mipmap 级别 0,一切正常,
我正在使用 this lovely tutorial. 进行阴影转换这个过程是,我们将场景渲染到一个帧缓冲区,附加到它的是一个立方体贴图来保存深度值。然后,我们将这个立方体贴图传递给片段着色器,片段着
为什么是glTexSubImage2D()突然导致 GL_INVALID_OPERATION? 我正在尝试将我过时的增强现实应用程序从 iOS4.x 升级到 iOS5.x,但我遇到了困难。我运行的是
我将 OpenGL 与 LWJGL 和我自己的非常小的框架一起用于琐碎的任务。我正在关注OpenGL SuperBible: Comprehensive Tutorial and Reference
我正在开发一些图形应用程序,在 glPopAttrib() 之后我得到了一个 GL_INVALID_OPERATION。预测答案“您似乎在 glBegin/glEnd block 中调用了 glPop
我正在尝试从已有效编译和链接的程序中检索二进制文件。我已经通过 GL_PROGRAM_BINARY_LENGTH 收到了它的长度。该文档说有两个实例可能会发生 GL_INVALID_OPERATION
当我尝试为 gound 分配几何图形时,我在示例的最开始遇到异常,here和 here : 此时 gl4.glNamedBufferData(vertexBuffer[0], Vertex.size(
我已将错误范围缩小到此 OpenGL 调用: glVertexAttribPointer(var.vertex, 4, GL_FLOAT, GL_FALSE, 0, 0); 前面没有错误,后面有 GL
我当前正在连接 OpenGL 应用程序并收到GL_INVALID_OPERATION。整个 GL 分散在多个文件中,很难从中创建示例,但我已经使用 apitrace 创建了 OpenGL 跟踪。这是造
我正在浏览 OGLdev教程,而且我一直坚持让顶点数组对象工作。相关代码如下: glBindBuffer(GL_ARRAY_BUFFER, buffers[POS_VB]); FloatBuffer
我有两个具有 TextureView 的 fragment 来显示相机预览或播放视频。 在使用应用程序一段时间后,玩弄屏幕,我在 logcat 中收到此错误 OpenGLRenderer﹕ GL_IN
嘿,我有一个抽象所有与着色器相关的类,名为 Shader.cpp : #include "Shader.h" #include "Renderer.h" #include #include Sha
我目前正在研究阴影贴图。我找到了 Paul 的项目 http://www.paulsprojects.net/tutorials/smt/smt.html ,我目前正在尝试实现这一点。但我无法获得合适
当我在下面的代码中调用 glUniformMatrix4fv 或 glUniform4fv 时,它每次都会引发 GL_INVALID_OPERATION,我尝试更改我传递矩阵数据的方式,我传递 id
我正在使用 OpenGL 核心配置文件 3.3 版 当我调用 glVertexAttribPointer 时,我得到 GL_INVALID_OPERATION。我已经 checkout http://
我目前正在学习 OpenGL 3.X,正在使用 ubuntu 14.04。我正在使用 C 语言创建我的应用程序和 SDL2 库。 命令 glxinfo | grep "OpenGL version"
我的目标是让实例化渲染工作,但即使是单个 glDrawElements 现在也会失败。注意:此代码已在 Windows 上运行。然而在 OS X 上它失败了 GL_INVALID_OPERATION
这是我的(包装的)OpenGL 调用,它导致 GL_INVALID_OPERATION: GLTextures.TexImage2D(TexImage2DTarget.TEXTURE_2D, 0, T
我试图让 OpenGL ES 2.0 在 Windows 7 上使用(Google 的)Angle 运行,但是无论我把它放在哪里,glGetError() 都会无限返回 GL_INVALID_OPER
我正在尝试找出模板。现在我只是用模板值绘制一些框,然后读取值。每次我用 GL_STENCIL_INDEX 调用 glReadPixels 时,我都会得到 GL_INVALID_OPERATION。这是
我是一名优秀的程序员,十分优秀!