c++ - 将着色器附加到程序时出现 OpenGL 错误 #1281
问题描述
将已编译的着色器附加到我的程序时,出现 OpenGL 错误 #1281。这是顶点着色器代码:
#version 330 core
layout(location = 0) in vec2 position;
void main(){
gl_Position = vec4(position, 0.0f, 0.0f);
}
这是片段着色器代码:
#version 330 core
out vec4 color;
void main(){
color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
这是创建着色器(程序)的方法:
Shader::Shader(std::string vsfilename, std::string fsfilename)
:program(glCreateProgram()) {
const char* vscode = fileToString(vsfilename.c_str());
const char* fscode = fileToString(fsfilename.c_str());
unsigned int vs, fs;
//Compiling Vertex shader
vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vscode, NULL);
glCompileShader(vs);
int result;
glGetShaderiv(vs, GL_COMPILE_STATUS, &result);
if(!result){
glGetShaderiv(vs, GL_INFO_LOG_LENGTH, &result);
char* infolog = (char*) malloc(result*sizeof(char));
glGetShaderInfoLog(vs, result, &result, infolog);
std::cout<<"Problem with vs compilation"<<std::endl;
std::cout<<infolog<<std::endl;
free((void*)infolog);
glDeleteShader(vs);
vs = 0;
}
fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &fscode, NULL);
glCompileShader(fs);
glGetShaderiv(fs, GL_COMPILE_STATUS, &result);
if(!result){
glGetShaderiv(fs, GL_INFO_LOG_LENGTH, &result);
char* infolog = (char*) malloc(result*sizeof(char));
glGetShaderInfoLog(fs, result, &result, infolog);
std::cout<<"Problem with fs compilation"<<std::endl;
std::cout<<infolog<<std::endl;
free((void*)infolog);
glDeleteShader(fs);
fs = 0;
}
glAttachShader(vs, program);
int error;
do{
error = glGetError(); //error 1281
std::cout<<error<<std::endl;
} while(error != 0);
glAttachShader(fs, program);
glLinkProgram(program);
glValidateProgram(program);
glDetachShader(vs, program);
glDetachShader(fs, program);
glDeleteShader(vs);
glDeleteShader(fs);
free((void*)vscode);
free((void*)fscode);
}
解决方案
错误 1281 表示 INVALID_VALUE,如果程序或着色器不是由 OpenGL 生成的值,则会生成错误。
的第一个参数glAttachShader
是程序,第二个参数是着色器:
glAttachShader(vs, program);
glAttachShader(program, vs);
推荐阅读
- c# - 内存性能计数器 C#
- java - 使用 List 作为参数时出现不兼容类型错误
- python - 谷歌课堂活动不显示在谷歌日历 api 上
- javascript - 工具栏错误放置的导航项反应
- json - 在 lua 中解码 JSON 的问题
- powerapps - 过滤 Powerapps 列表
- spring-cloud-gateway - Spring Cloud Gateway:在路径中使用查询参数值?
- javascript - 如何修复 nginx 上的 http 414 Request-URI Too Large 错误?
- python - pandas 第二列中值的条件计数?
- java - 批量插入需要非常长的时间