Shader::Shader(const char* vertexShader_path, const char* fragmentShader_path)
{
int success;
char infoLog[512];
ID = glCreateProgram();//创建programID
const char* vertexShaderSource = Load(vertexShader_path);//读取顶点着色器资源
GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);//创建顶点着色器ID
glShaderSource(vertexShaderID, 1, &vertexShaderSource, 0);//绑定资源
glCompileShader(vertexShaderID);//编译顶点着色器
glGetShaderiv(vertexShaderID, GL_COMPILE_STATUS, &success);//检测是否编译成功
if (!success)//如果失败
{
glGetShaderInfoLog(vertexShaderID, 512, NULL, infoLog);//获取错误日志
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
};
const char* fragmentShaderSource = Load(fragmentShader_path);//读取片段着色器资源
GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);//创建片段着色器ID
glShaderSource(fragmentShaderID, 1, &fragmentShaderSource, 0);//绑定资源
glCompileShader(fragmentShaderID);//编译片段着色器
glGetShaderiv(fragmentShaderID, GL_COMPILE_STATUS, &success);//检测是否编译成功
if (!success)//如果失败
{
glGetShaderInfoLog(fragmentShaderID, 512, NULL, infoLog);//获取错误日志
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
};
//链接着色器至program
glAttachShader(ID, vertexShaderID);
glAttachShader(ID, fragmentShaderID);
//删除着色器
glDeleteShader(vertexShaderID);
glDeleteShader(fragmentShaderID);
}
#version 330 core
layout(location = 0) in vec3 aPos;
layout(location = 1) in vec3 aColor;
out vec3 vColor;
void main()
{
gl_Position = vec4(aPos,1.0f);
vColor = aColor;
}
复制了你的顶点着色器代码 可以运行 没有语法错误 应该是没问题的 具体的你可能要看看是不是传形参(const char* vertexShader_path)进来传错了顶点着色器的名字
const char* Load(const char* Shader_path)//读取着色器资源
{
std::string ShaderSource;
std::ifstream ifs(Shader_path);
if (!ifs.is_open())
{
std::cerr << "ERROR:No such directory or file" << endl;
return "";
}
while (!ifs.eof())
{
ShaderSource += ifs.get();
}
const char* source = ShaderSource.c_str();
cout << ShaderSource << endl << endl;
ifs.close();
return source;
}
Shader::Shader(const char* vertexShader_path, const char* fragmentShader_path)
{
int success;
char infoLog[512];
std::string ShaderSource;
std::ifstream ifs(vertexShader_path);
if (!ifs.is_open())
{
std::cerr << "ERROR:No such directory or file" << endl;
return;
}
while (!ifs.eof())
{
ShaderSource += ifs.get();
}
ifs.close();
ID = glCreateProgram();//创建programID
const char* vertexShaderSource = ShaderSource.c_str();//读取顶点着色器资源
cout << vertexShaderSource << endl;
GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);//创建顶点着色器ID
glShaderSource(vertexShaderID, 1, &vertexShaderSource, 0);//绑定资源
glCompileShader(vertexShaderID);//编译顶点着色器
glGetShaderiv(vertexShaderID, GL_COMPILE_STATUS, &success);//检测是否编译成功
if (!success)//如果失败
{
glGetShaderInfoLog(vertexShaderID, 512, NULL, infoLog);//获取错误日志
std::cerr << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
};
ShaderSource.clear();
ifs.open(fragmentShader_path);
if (!ifs.is_open())
{
std::cerr << "ERROR:No such directory or file" << endl;
return;
}
while (!ifs.eof())
{
ShaderSource += ifs.get();
}
ifs.close();
const char* fragmentShaderSource = ShaderSource.c_str();//读取片段着色器资源
cout << fragmentShaderSource << endl;
GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);//创建片段着色器ID
glShaderSource(fragmentShaderID, 1, &fragmentShaderSource, 0);//绑定资源
glCompileShader(fragmentShaderID);//编译片段着色器
glGetShaderiv(fragmentShaderID, GL_COMPILE_STATUS, &success);//检测是否编译成功
if (!success)//如果失败
{
glGetShaderInfoLog(fragmentShaderID, 512, NULL, infoLog);//获取错误日志
std::cerr << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
};
//链接着色器至program
glAttachShader(ID, vertexShaderID);
glAttachShader(ID, fragmentShaderID);
glGetProgramiv(ID, GL_LINK_STATUS, &success);
if (!success)
{
glGetProgramInfoLog(ID, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
}
//删除着色器
glDeleteShader(vertexShaderID);
glDeleteShader(fragmentShaderID);
}