我在检索着色器程序的二进制文件时遇到问题。
我创建了一个名为“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,¶m);
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仍然是空的。我没有线索为什么会发生这种情况。