Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL编译的着色器已损坏_Opengl - Fatal编程技术网

OpenGL编译的着色器已损坏

OpenGL编译的着色器已损坏,opengl,Opengl,我试图在OpenGL 3.2中编译一个着色器程序,但我遇到了一个奇怪的链接错误 在创建顶点和片段着色器并编译和附加它们之后,我尝试将它们链接到程序中,但出现以下infolog错误: ERROR: Compiled vertex shader was corrupt. ERROR: Compiled fragment shader was corrupt. 我完全不知道这意味着什么,我在谷歌上唯一能找到的就是忽略它。然而,当我使用glUseProgram()时,我得到了一个无效的操作,所以我不能

我试图在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);
}
让它发挥作用

起初,我用另一个编辑器(text mate)重写着色器,然后它有时会工作。然后我确保它正确地以null结尾,并且每次都能正常工作


也许有一些非印刷品的角色,就像安登·M·科尔曼建议的那样

我也遇到了同样的问题,并且发现如果使用'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();
  // 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;
}
int shaderFromFile(const std::string&filePath,GLenum shaderType){
//打开文件
std::iff流;
f、 打开(filePath.c_str(),std::ios::in);
如果(!f.是开的()){
抛出std::runtime_错误(std::string(“打开文件失败:”)+filePath);
}
//将整个文件读入stringstream缓冲区
std::stringstream缓冲区;

缓冲区你也记录编译错误了吗?你能显示着色器代码吗?我完全忘了放着色器代码。它在编辑中。没有报告编译错误。你在顶点着色器中有
out outPos
,但在片段着色器中没有相应的
in
参数。从着色器代码的外观,你可以删除此变量完全可以-您无论如何都不会使用它。字符串是否正确地以null结尾?这两个字符串的结尾可能都有非打印字符。至于此错误消息的含义,谁知道呢?这是GLSL的一个问题,每个供应商都实现了自己的编译器,并且没有标准化的错误消息:-\n如果我们不过我知道你的驱动程序供应商。非常感谢你发现了这个奇怪的错误。否则我会整晚睡不着的。