8

我正在尝试在 OpenGL 3.2 中编译着色器程序,但出现了一个奇怪的链接错误。

创建顶点和片段着色器编译并附加它们后,我尝试将它们链接到程序中,但我收到以下信息日志错误:

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);
}
4

2 回答 2

6

让它工作。

起初我用另一个编辑器(文本伴侣)重写了着色器,然后它有时会起作用。然后我确保它正确地以空值终止并且每次都有效。

也许不知何故有像 Andon M. Coleman 建议的非印刷字符。

于 2013-09-26T14:14:50.440 回答
5

我遇到了同样的问题,发现如果您使用“std::stringstream 缓冲区”读取文件,就像网络上使用的许多代码示例一样,需要使用 .str().c_str() 方法来获取 *ptr对于 glShaderSource,指针会被删除,这意味着您会收到随机链接器错误。这是我创建的工作...

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();
  // need to copy, as pointer is deleted when call is finished
  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;
}
于 2016-09-24T06:16:46.683 回答