2013-09-26 67 views
5

我想在OpenGL 3.2中编译一个着色器程序,但我得到一个奇怪的链接错误。OpenGL编译着色器被破坏

创建顶点和片段着色器编译和连接它们之后,我尝试将它们连接成一个程序,但我得到以下信息日志错误:

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

你登录编译错误太多了,你可以显示着色器的代码? – Appleshell

+0

我完全忘了放置着色器代码。它正在编辑中。没有编译错误报告。 – zync

+1

您在顶点着色器中有out outP,但在片段着色器中没有对应的in参数。从着色器代码的外观你可以完全删除这个变量 - 无论如何你都不会使用它。 – keltar

回答

5

得到它的工作。

起初我用其他编辑器(文本伴侣)重写了着色器,然后它有时会起作用。然后我确定它已正确空终止,并且每次都有效。

也许在某种程度上有像Andon M. Coleman建议的非打印字符。

3

我有同样的问题,并发现,如果您使用'std :: stringstream缓冲区'来读取文件,尽可能多的代码示例在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; 

}