我对现代 OpenGL (3.0+) 还很陌生,现在我正在尝试在黑色背景上创建一个基本的白色三角形。我在 Mac OS X Mavericks 10.9.2 上,使用 GLFW 3.0.4 创建窗口,使用 GLEW 1.10.0 加载扩展。您可以找到full source code here.
我的问题是,我的片段着色器不想附加到我的程序中。我检查了程序 (glIsProgram()
) 和着色器 (glIsShader
),它们都通过了。着色器正在编译,程序正在链接..
但是我的代码编译、运行并且没有抛出任何错误,我只得到一个带有黑色背景但没有白色三角形的运行窗口。这是我认为以某种方式损坏的部分(或者至少这是我可以找到错误的地方):
const char* opengl_get_error(void)
{
switch (glGetError())
{
case 0x0500: return "GL_INVALID_ENUM";
case 0x0501: return "GL_INVALID_VALUE";
case 0x0502: return "GL_INVALID_OPERATION";
case 0x0503: return "GL_STACK_OVERFLOW";
case 0x0504: return "GL_STACK_UNDERFLOW";
case 0x0505: return "GL_OUT_OF_MEMORY";
case 0x0506: return "GL_INVALID_FRAMEBUFFER_OPERATION";
case 0x8031: return "GL_TABLE_TOO_LARGE";
default: return "GL_NO_ERROR";
}
}
void check_attached_shaders(GLuint program)
{
GLsizei count = 0;
GLuint shaders[] = {0, 0, 0, 0};
glGetAttachedShaders(program, 4, &count, shaders);
printf(">>> ERROR: %s\n", opengl_get_error());
printf("\tnumber of shaders: %d\n", count);
for (int i=0; i < 4; i++) printf("\tshader_id: %d\n", shaders[i]);
}
...
// Get program ID
GLuint programID = glCreateProgram();
// Attach shaders
/* CHECKING: */ check_attached_shaders(programID);
glAttachShader(programID, vert_shader);
/* CHECKING: */ check_attached_shaders(programID);
glAttachShader(programID, frag_shader);
/* CHECKING: */ check_attached_shaders(programID);
// Link shader program
glLinkProgram(programID);
...
我有这个输出:
/*
>>> ERROR: GL_NO_ERROR
number of shaders: 0
shader_id: 0
shader_id: 0
shader_id: 0
shader_id: 0
>>> ERROR: GL_NO_ERROR
number of shaders: 1
shader_id: 1
shader_id: 0
shader_id: 0
shader_id: 0
>>> ERROR: GL_INVALID_OPERATION
number of shaders: 1
shader_id: 1
shader_id: 0
shader_id: 0
shader_id: 0
*/
这就是我的顶点着色器的样子:
// OpenGL Shading Language Version 1.5.0
#version 150 core
in vec2 input_position;
void main()
{
gl_Position = vec4(input_position, 0.f, 1);
}
这就是我的片段着色器的样子:
// OpenGL Shading Language Version 1.5.0
#version 150 core
out vec4 output_fragment;
void main()
{
output_fragment = vec4(1.f, 1.f, 1.f, 1.f);
}
欢迎任何反馈,
提前致谢!
最佳答案
正如评论中所述,问题出在函数 GLuint create_shader_from_file(GLchar *path, GLenum shader_type)
中,该函数从源文件编译着色器并返回 0 或 1 来指示失败或成功。
然后将结果用作着色器 ID。
关于c - 为什么片段着色器没有附加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22610779/