无法检索着色器二进制文件

时间:2017-05-24 16:04:34

标签: c++ opengl shader

我在检索着色器程序的二进制文件时遇到问题。

我创建了一个名为“Building”的类,它具有以下静态成员:

  static GLenum binary_format;
  static unsigned char * program_binary;
  static GLsizei binary_size;
  static GLsizei binary_length;

我使用program_binary来存储着色器程序, 我将这些成员设置为静态,以便从中恢复它们的值 一旦第一个实例用适当的值填充它们,该类的任何实例。 该类还具有以下成员方法,我将其用作设置着色器程序的例程:

 void Building::setShaders()
  {     


    if(program_binary == nullptr)
      {


    shader_prog = glCreateProgram();

    GLchar const *vss[]=
      {
        *smanager.getVShaderSource(0),
        *smanager.getVShaderSource(1)       
      };

    GLuint vs = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vs,2,vss,NULL);
    glCompileShader(vs);


    GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fs,1,smanager.getFShaderSource(0),NULL);
    glCompileShader(fs);


    //CHECKING COMPILE STATUS
    GLint vs_status;
    glGetShaderiv(vs,GL_COMPILE_STATUS,&vs_status);

    GLint fs_status;
    glGetShaderiv(fs,GL_COMPILE_STATUS,&fs_status);


    if(vs_status == 0 || fs_status == 0)
      {

        if(vs_status == 0)
          {
        GLint log_length;
        glGetShaderiv(vs,GL_INFO_LOG_LENGTH,&log_length);
        char log[log_length];
        glGetShaderInfoLog(vs,log_length,NULL,log);
        printVShaderLog(log);
          }

        if(fs_status == 0)
          {
        GLint log_length;
        glGetShaderiv(fs,GL_INFO_LOG_LENGTH,&log_length);
        char log[log_length];
        glGetShaderInfoLog(fs,log_length,NULL,log);
        printFShaderLog(log);
          }

      }


    else
      {

        glAttachShader(shader_prog,vs);
        glAttachShader(shader_prog,fs);
        glProgramParameteri(shader_prog,GL_PROGRAM_BINARY_RETRIEVABLE_HINT,GL_TRUE);        
        glLinkProgram(shader_prog);

        GLint param;
        glGetProgramiv(shader_prog,GL_LINK_STATUS,&param);

        if(param)
          {
        printShaderLinkState(param,NULL);

        glGetProgramiv(shader_prog,GL_PROGRAM_BINARY_LENGTH,&binary_size);

        std::cerr<<"binary_size is "<<binary_size<<std::endl;
        //binary_size is zero !

        program_binary = new unsigned char [binary_size];
        glGetProgramBinary(shader_prog,binary_size,&binary_length,&binary_format,program_binary);

          }
        else
          {

        GLint logLength;
        glGetProgramiv(shader_prog,GL_INFO_LOG_LENGTH,&logLength);
        char log[logLength];
        glGetProgramInfoLog(shader_prog,logLength,NULL,log);
        printShaderLinkState(param,log);        
          }



      }


    glDeleteShader(vs);
    glDeleteShader(fs);

            }//if(program_binary == nullptr)
        else        

 glProgramBinary(shader_prog,binary_format,program_binary,binary_length);



  }

问题是glGetProgramiv(shader_prog,GL_PROGRAM_BINARY_LENGTH,&binary_size);提供的长度 然后,我尝试将binary_size = 100只是为了查看是否有东西被写入program_binary指针,但函数glGetProgramBinary(shader_prog,binary_size,&binary_length,&binary_format,program_binary);也没有工作,实际上program_binary仍然是空的。我没有线索为什么会发生这种情况。

0 个答案:

没有答案