繁体   English   中英

为什么片段着色器没有附加?

[英]Why fragment shader didn't attach?

我是现代OpenGL(3.0+)的新手,现在我正在尝试在黑色背景上创建一个基本的白色三角形。 我在Mac OS X Mavericks 10.9.2上,使用GLFW 3.0.4创建窗口,使用GLEW 1.10.0加载扩展。 您可以在此处找到完整的源代码。

我的问题是,片段着色器不想附加到程序中。 我检查了程序( 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)GLuint create_shader_from_file(GLchar *path, GLenum shader_type)从源文件编译了一个着色器,并返回0或1以指示失败或成功。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM