C 为什么碎片着色器没有';你不接吗?

C 为什么碎片着色器没有';你不接吗?,c,opengl,shader,C,Opengl,Shader,我对现代OpenGL(3.0+)非常陌生,现在我正在尝试在黑色背景上创建一个基本的白色三角形。我在Mac OS X Mavericks 10.9.2上,使用GLFW 3.0.4创建窗口,使用GLEW 1.10.0加载扩展。你可以找到 我的问题是,我的片段着色器不希望附加到我的程序。我检查了程序(glIsProgram())和着色器(glIsShader),它们都通过了。着色器正在编译,程序正在链接 然而,我的代码编译、运行并且没有抛出任何错误,我只得到了一个黑色背景但没有白色三角形的运行窗口。以

我对现代OpenGL(3.0+)非常陌生,现在我正在尝试在黑色背景上创建一个基本的白色三角形。我在Mac OS X Mavericks 10.9.2上,使用GLFW 3.0.4创建窗口,使用GLEW 1.10.0加载扩展。你可以找到

我的问题是,我的片段着色器不希望附加到我的程序。我检查了程序(
glIsProgram()
)和着色器(
glIsShader
),它们都通过了。着色器正在编译,程序正在链接

然而,我的代码编译、运行并且没有抛出任何错误,我只得到了一个黑色背景但没有白色三角形的运行窗口。以下是部分,我认为它不知何故被破坏了(或者至少在这里我可以找到错误):

const char*opengl\u get\u错误(void)
{
开关(glGetError())
{
案例0x0500:返回“GL\u无效\u枚举”​";
案例0x0501:返回“GL\u无效值”​";
案例0x0502:返回“GL\u无效\u操作​";
案例0x0503:返回“GL_堆栈_溢出​";
案例0x0504:返回“GL_堆栈_下溢​";
案例0x0505:返回“GL\u OUT\u内存”​";
案例0x0506:返回“GL\u无效\u帧缓冲区\u操作”​";
案例0x8031:返回“总账表太大”​";
默认值:返回“总账无误”;
}
}
无效检查附加着色器(GLuint程序)
{
GLsizei计数=0;
GLuint着色器[]={0,0,0,0};
glGetAttachedShaders(程序、4和计数、着色器);
printf(“>>>错误:%s\n”,opengl_get_ERROR());
printf(“\t着色器数量:%d\n”,计数);
对于(inti=0;i<4;i++)printf(“\tshader\u id:%d\n”,着色器[i]);
}
...
//获取程序ID
GLuint programID=glCreateProgram();
//附加着色器
/*检查:*/检查附加的着色器(programID);
glAttachShader(programID,vert_着色器);
/*检查:*/检查附加的着色器(programID);
glAttachShader(programID,frag_着色器);
/*检查:*/检查附加的着色器(programID);
//链接着色器程序
glLinkProgram(programID);
...
我有这个输出:

/*
>>>错误:总帐无错误
着色器数量:0
着色器\u id:0
着色器\u id:0
着色器\u id:0
着色器\u id:0
>>>错误:总帐无错误
着色器数量:1
着色器_id:1
着色器\u id:0
着色器\u id:0
着色器\u id:0
>>>错误:GL\U操作无效
着色器数量:1
着色器_id:1
着色器\u id:0
着色器\u id:0
着色器\u id:0
*/
这就是我的顶点着色器的外观:

//OpenGL着色语言1.5.0版
#版本150核心
在vec2输入_位置;
void main()
{
gl_位置=vec4(输入_位置,0.f,1);
}
这就是我的片段着色器的外观:

//OpenGL着色语言1.5.0版
#版本150核心
输出vec4输出_片段;
void main()
{
输出_片段=vec4(1.f,1.f,1.f,1.f);
}
欢迎任何反馈


提前感谢!

如评论中所述,问题出在函数
GLuint create_shader_from_file(GLchar*path,GLenum shader_type)
中,该函数从源文件编译着色器,并返回0或1以指示失败或成功


然后将结果用作着色器ID。

如注释中所述,问题在于函数
GLuint create_shader_from_file(GLchar*path,GLenum shader_type)
从源文件编译着色器并返回0或1以指示失败或成功


然后,结果被用作着色器ID。

这是因为在
从着色器创建\u程序中
链接程序后将着色器从程序中分离吗?@doron如果我注释掉
glDetachShader()
行,它仍然不起作用,而且我仍然有
GL\u INVALID\u操作符
错误。你的顶点着色器至少错过了投影矩阵为什么要使用“magic”“opengl_get_error switch语句中的十六进制数,而不是人类可读的标记?此外,您必须在循环中调用
glGetError
opengl\u get\u error
,直到它返回GL\u NO\u error,因为在opengl中,错误可能会累积。您的
create\u shader\u from\u file
返回0或1表示成功或失败,但您将结果用作shaderID。很可能是您附加了两次相同的着色器。这是因为在“从着色器创建程序”中链接程序后,在“从着色器创建程序”中分离了着色器吗?@doron如果我注释掉
glDetachShader()
行,它仍然不起作用,我仍然有
GL\u INVALID\u操作符
错误。你的顶点着色器至少错过了投影矩阵为什么在opengl\u get\u error switch语句中使用“魔法”十六进制数而不是人类可读的标记?此外,您必须在循环中调用
glGetError
opengl\u get\u error
,直到它返回GL\u NO\u error,因为在opengl中,错误可能会累积。您的
create\u shader\u from\u file
返回0或1表示成功或失败,但您将结果用作shaderID。很可能是两次附加同一着色器。