我的openGL着色器不会在eclipse之外链接?

时间:2012-11-05 12:17:56

标签: windows eclipse opengl glsl

因此,我正在尝试为学校构建一个简单的螺旋形发生器,并且在eclipse CDT for windows 7中一切都很顺利。我的程序为每个生成的螺旋计分配一个默认着色器(最多5个)。还有3个其他着色器程序,用户可以选择分配给任何肺活量计。在eclipse中它的工作原理应该如此,但是当在eclipse之外运行时,着色器无法链接。该程序使用GLUT和GLEW,我已在可执行文件的目录中包含必要的.dll。我一直在努力解决这个问题4个小时,并且不知道是什么原因会导致在日食之外连接失败并且不会一直失败。

我不打算包含所有着色器,但这里是前2个无法链接并导致应用程序终止

#version 330 

layout (location = 0) in vec4 vPosition; 
uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;

out vec4 color; 

void main() 
{ 
   gl_Position = proj * view * model * vPosition;
   color = vec4( 
        (4 - vPosition.z) * (4 - vPosition.z) / 16.0, 
        (2.0 - abs( 2.0 - vPosition.z )) / 2.0, 
        vPosition.z * vPosition.z / 16.0,
        1.0
   );
}

和片段着色器

#version 330 

in vec4 color; 

void main() 
{ 
   gl_FragColor = color;
}

和printlog

Vertex shader was successfully compiled to run on hardware.

Fragment shader was successfully compiled to run on hardware.
Fragment shader(s) failed to link,  vertex shader(s) failed to link. 
ERROR: error(#280) Not all shaders have valid object code
ERROR: error(#280) Not all shaders have valid object code

我用来编译和链接着色器的InitShader()函数适用于我过去所做的应用程序。我唯一不同的是我使用它来生成一些不同的着色器程序并将它们分配给programs[],而不是仅仅编译1并为整个应用程序运行它。

program[0] = InitShader("shaders/vshader.glsl", "shaders/fshader.glsl");
program[1] = InitShader("shaders/vshader2.glsl", "shaders/fshader.glsl");
program[2] = InitShader("shaders/vshader3.glsl", "shaders/fshader.glsl");
program[3] = InitShader("shaders/vshaderw.glsl", "shaders/fshader.glsl");

但不管怎样,这里是InitShader()的代码。

GLuint InitShader(const char* source, GLenum type)
{
    GLuint shader = glCreateShader(type);
    glShaderSource(shader, 1, (const GLchar**) &source, NULL );
    glCompileShader(shader);
    printLog( shader );

    return shader;
}

GLuint InitShader(const char* vfile, const char *ffile) {
    GLuint program = glCreateProgram();
    GLuint shader;

    // stringify and attach vshader
    std::ifstream vertstream(vfile);
    std::string vert((std::istreambuf_iterator<char>(vertstream)), std::istreambuf_iterator<char>());
    shader = InitShader(vert.c_str(), GL_VERTEX_SHADER);
    glAttachShader( program, shader );

    // stringify and attach fshader
    std::ifstream fragstream(ffile);
    std::string frag((std::istreambuf_iterator<char>(fragstream)), std::istreambuf_iterator<char>());
    shader = InitShader(frag.c_str(), GL_FRAGMENT_SHADER);
    glAttachShader( program, shader );

    // link program
    glLinkProgram(program);

    printLog(program);
    // link  and error check
    GLint  linked;
    glGetProgramiv( program, GL_LINK_STATUS, &linked );
    if ( !linked ) {
        fprintf(stderr, "Shaders failed to link!\n");
        exit( EXIT_FAILURE );
    }

    // use program object
    glUseProgram(program);

    return program;
}

凌晨4点,所以我的灰色细胞大概用完了哈哈。并且fyi它不是真正的功课帮助,可执行文件不需要在eclipse之外运行,我只是想知道如何为自己创建独立程序。

1 个答案:

答案 0 :(得分:3)

问题的原因在于:

program[0] = InitShader("shaders/vshader.glsl", "shaders/fshader.glsl");

着色器源文件的路径是 relative 。有可能Eclipse在不同的工作目录(可能是您的项目根目录)中运行您的程序,而不是直接执行程序时的工作目录。

解决方案:

  • 确保程序启动时的工作目录与内部使用的相对路径匹配(非常不可靠)
  • 在程序中使用绝对路径(非常不灵活)

或者,我的建议

  • 在运行时确定着色器文件的位置(命令行选项,可执行二进制文件的位置等),并在运行时相应地调整路径。