gpt4 book ai didi

c - OpenGL(在 Ubuntu 中): glGetError() returns GL_INVALID_OPERATION

转载 作者:行者123 更新时间:2023-12-02 08:46:12 27 4
gpt4 key购买 nike

关于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) 返回一个 truefalse 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_STATUSglGetProgramInfoLog 在程序对象上测试同样的事情

关于c - OpenGL(在 Ubuntu 中): glGetError() returns GL_INVALID_OPERATION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12311158/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com