我正在尝试在OpenGL 3.2中编译着色器程序,但是我遇到了一个奇怪的链接错误。
在创建顶点和片段着色器编译并附加它们之后,我尝试将它们链接到一个程序中,但是我收到以下infolog错误:
ERROR: Compiled vertex shader was corrupt.
ERROR: Compiled fragment shader was corrupt.
我完全不知道这意味着什么,我在谷歌上唯一能找到的就是忽略它。但是,当我glUseProgram()时,我得到一个无效的操作,所以我不能忽略这个错误。
此外,我刚刚更新到XCode 5,并且完全相同的代码/着色器源工作。不知道它是如何相关的..
编辑:着色器源
顶点:
#version 150
in vec3 position;
uniform mat4 worldMatrix;
uniform float time;
out vec3 outPos;
void main(){
gl_Position = worldMatrix*vec4(position, 1.0);
outPos = position;
}
片段:
#version 150
out vec4 outColor;
uniform float time;
uniform float red;
uniform float green;
uniform float blue;
void main(){
outColor=vec4(red, green, blue,1.0);
}
答案 0 :(得分:6)
让它发挥作用。
起初我用另一个编辑器(文本伙伴)重写了着色器,然后它有时会工作。然后我确保它被正确地终止并且每次都有效。
也许不知怎的,有像Andon M. Coleman这样的非打印角色。
答案 1 :(得分:3)
我有同样的问题,并发现如果你使用' std :: stringstream buffer'要读取文件,就像Web上使用的代码示例一样,方法.str()。c_str()获取glShaderSource所需的* ptr,指针被删除,这意味着,您会得到随机链接器错误。这是我创造的工作......
int shaderFromFile(const std::string& filePath, GLenum shaderType) {
//open file
std::ifstream f;
f.open(filePath.c_str(), std::ios::in);
if(!f.is_open()){
throw std::runtime_error(std::string("Failed to open file: ") + filePath);
}
//read whole file into stringstream buffer
std::stringstream buffer;
buffer << f.rdbuf();
buffer << "\0";
f.close();
//需要复制,因为在调用完成时删除了指针 std :: string shaderCode = buffer.str()。c_str();
//create new shader
int ShaderID = glCreateShader(shaderType);
//set the source code
const GLchar* code = (const GLchar *) shaderCode.c_str();
glShaderSource(ShaderID, 1, &code, NULL);
//compile
glCompileShader(ShaderID);
//throw exception if compile error occurred
GLint status;
glGetShaderiv(ShaderID, GL_COMPILE_STATUS, &status);
std::cout << "Status from compile:" << status << "\r\n";
if (status == GL_FALSE) {
std::string msg("Compile failure in shader:\n");
GLint infoLogLength;
glGetShaderiv(ShaderID, GL_INFO_LOG_LENGTH, &infoLogLength);
char* strInfoLog = new char[infoLogLength + 1];
glGetShaderInfoLog(ShaderID, infoLogLength, NULL, strInfoLog);
msg += strInfoLog;
delete[] strInfoLog;
glDeleteShader(ShaderID); ShaderID = 0;
throw std::runtime_error(msg);
}
return ShaderID;
}