写opengl时,编译出现了这个错误,查了很久都没有找出问题,网上大部分说的是读取shader文件的时候出错了,或者将gl_Position拼错,或者是没有给gl_Position赋值。我检查我的代码都没有上面的问题,后来发现是API用错了。
错误代码:
vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(GL_VERTEX_SHADER, 1, &vsCode, NULL); // 错误用法
glCompileShader(vs);
正确代码:
vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vsCode, NULL); // 正确用法
glCompileShader(vs);
这个错误发生在链接阶段,即将vertex shader和fragment shader链接到着色器程序上的阶段。在shader编译的时候只会检察语法错误,因此像上面的错误示例编译的时候是不会报错的,因为vs没有根本就没有加载shader代码,在编译vs的时候,shader代码是空的,就不会有语法错误,而不会报错。但是在链接的时候,需要检察一些全局的参数——传递数据的参数是否被赋值了没,其中gl_Position就是将经过顶点着色器转换后的顶点数据传递到片段着色器,因为顶点着色器没有代码,gl_Position就没有被赋值,这就是我上面报错的原因。
自己通过查询和调试,总结出一些导致产生这个错误的原因:
1.保证shader代码的字符串正确。shader代码从文件中读取时,需要注意文件的编码格式,带标签的编码,都会有前缀,会导致错误;行尾也是一样。检查方法,可以在调用glShaderSource()时,将shader的字符串打印出来。
2.gl_Position拼写正确,有些错误是因为拼写成gl_position了。
3.要给gl_Position赋值
4.api调用正确