C++ 着色器附件错误。无效程序或着色器
我在写我的图形程序。我试图将着色器中的特征抽象到一个类中。我测试了常规绘图代码,它可以正常工作。着色器也可以运行,但一旦我开始使用这些OpenGL着色器函数,它就会停止工作C++ 着色器附件错误。无效程序或着色器,c++,oop,opengl,glsl,C++,Oop,Opengl,Glsl,我在写我的图形程序。我试图将着色器中的特征抽象到一个类中。我测试了常规绘图代码,它可以正常工作。着色器也可以运行,但一旦我开始使用这些OpenGL着色器函数,它就会停止工作 Shader::Shader(char c) { //program = int(0); if (program!=0 || glIsProgram(program)) glDeleteProgram(program); uniforms.clear(); program =
Shader::Shader(char c)
{
//program = int(0);
if (program!=0 || glIsProgram(program))
glDeleteProgram(program);
uniforms.clear();
program = glCreateProgram();
}
void Shader::compileProgram()
{
GLint Result = GL_FALSE;
int InfoLogLength;
glLinkProgram(program);
glValidateProgram( program);
glGetProgramiv(program, GL_LINK_STATUS, &Result);
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &InfoLogLength);
std::string ProgramErrorMessage = std::string();
ProgramErrorMessage.resize( glm::max(InfoLogLength, int(1)));
glGetProgramInfoLog(program, InfoLogLength, NULL, &ProgramErrorMessage[0]);
std::cout << ProgramErrorMessage.c_str() << std::endl;
}
void Shader::addToProgram( std::string File, GLenum type)
{
std::cout << glGetError() << std::endl;
GLuint shader = glCreateShader(type);
std::cout << glewGetErrorString(glGetError()) << std::endl;
std::string ShaderCode;
std::ifstream ShaderStream(File, std::ios::in);
if(ShaderStream.is_open())
{
std::string Line = "";
while(getline(ShaderStream, Line))
ShaderCode += Line + "\n";
ShaderStream.close();
}
GLint Result = GL_FALSE;
int InfoLogLength;
// Compile Vertex Shader
std::cout << "Compiling shader : " << File<< std::endl;
const char * SourcePointer = ShaderCode.c_str();
std::cout << SourcePointer << std::endl;
int length = ShaderCode.size();
glShaderSource(shader, 1, &SourcePointer , &length );
glCompileShader(shader);
// Check Vertex Shader
glGetShaderiv(shader, GL_COMPILE_STATUS, &Result);
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &InfoLogLength);
std::vector<char> ShaderErrorMessage(InfoLogLength);
glGetShaderInfoLog(shader, InfoLogLength, NULL, &ShaderErrorMessage[0]);
printf("%s\n", &ShaderErrorMessage[0]);
glAttachShader(program, shader); //Invalid Operation, eighter Program or shader invalid
std::cout << glGetError() << std::endl;
Shader::Shader(char c)
{
//程序=int(0);
if(program!=0 | | glIsProgram(program))
glDeleteProgram(program);
制服;
program=glCreateProgram();
}
void着色器::compileProgram()
{
闪烁结果=GLU FALSE;
int信息长度;
glLinkProgram(program);
GLP程序(程序);
glGetProgramiv(程序、GL链接状态和结果);
glGetProgramiv(程序、总账信息、日志长度和信息日志长度);
std::string ProgramErrorMessage=std::string();
resize(glm::max(InfoLogLength,int(1));
glGetProgramInfoLog(程序、InfoLogLength、NULL和ProgramErrorMessage[0]);
所以问题是程序无效
我所做的是:
if(!glIsProgram(program))
program = glCreateProgram();
glAttachShaders(program, shader);
我在构造函数中也做了同样的保护。我仍然想知道这是怎么发生的。我的意思是我在Debug中检查了值,它们似乎都是有效的。您是否收到编译器错误?您询问着色器是否正确编译,但您没有在某处使用“结果”。问题是我没有得到任何信息输出。但结果是0(GL_FALSE)。我实际上解决了这个问题,因为某种原因程序是无效的