iam*_*ind 2 c opengl glew vertex-shader
对于OpenGL学习,我指的是openglbook.目前在第2章中,我正在尝试运行其粘贴的代码以供参考.
我面临的问题是以下功能:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
如上面的函数(glew.h
)所示,它为什么会返回"GL_INVALID_OPERATION"
?
如果我评论这些行,那么它可以工作,但只是打印一个空白窗口.
这是我的glxinfo.由于我的版本是2.2并且此代码适用于3.3+,因此我删除了以下代码以避免失败:
glutInitContextVersion(4, 0);
glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);
glutInitContextProfile(GLUT_CORE_PROFILE);
Run Code Online (Sandbox Code Playgroud)
更新:在听完@Tim的回答后,我能够成功运行该程序; 似乎这些线条都是创造问题:
"#version 400 \n"(替换为"#version 130")
和
layout(location = 0)(已删除).layout(location = 1)(已删除).
但是由于这个原因,预期的三角形打印不完全相同.本教程可能会考虑最新的opengl版本,我没有这个版本,这就产生了问题.
有没有办法在不改变输出的情况下将代码从最新的OpenGL(4.0+)兼容代码修改为较小版本(例如<3.0)?我将无法升级图形硬件.
您没有对着色器编译和链接进行正确的错误检查.您的着色器中可能存在某种语法错误,导致其无法编译,因此您的useProgram调用会尝试使用无效程序.
对于每个着色器,在调用之后,glCompileShader
您将要调用glGetShaderiv(shader, GL_COMPILE_STATUS, compile_status)
哪个返回一个true
或false
在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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果两个着色器编译成功,则链接程序后,你想测试程序对象同样的事情glGetProgramiv/GL_LINK_STATUS
和glGetProgramInfoLog