c++ - OpenGL 着色器拒绝链接

标签 c++ opengl glsl freeglut

问题:

一直在努力让我的代码加载外部着色器,但它不工作。无论我如何重写代码并重试,我每次都会遇到同样的错误。

着色器编译但不会链接,我在这个函数中做错了什么吗?顺便说一句,错误捕获 block 工作得很好。

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.

我正在使用 freeglut、x64 windows 7 和 mingw(我没有使用 IDE)

用法:

在我的主循环中,我有 GLuint programId = loadShader("vertex.shader", "frag.shader"); 然后我使用 glUseProgram();

启用它
GLuint loadShader(const char * vertex_file_path, const char * fragment_file_path) {

    GLuint vertexShaderId = glCreateShader(GL_VERTEX_SHADER);
    GLuint fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER);
    GLuint programId = glCreateProgram();

    GLint status = GL_FALSE;
    int infoLogLength;
    std::string line = "";

    //read in and compile
    std::string vertexShaderCode = "";
    std::ifstream vifs(vertex_file_path);
    if(!vifs.is_open()) {

        while(getline(vifs, line))
            vertexShaderCode += line +"\n";
        vifs.close();
    }

    const char * vertexStream = vertexShaderCode.c_str();

    std::string fragmentShaderCode = "";
    std::ifstream fifs(fragment_file_path);
    if(!fifs.is_open()) {

        while(getline(fifs, line))
            fragmentShaderCode += line +"\n";
        fifs.close();
    }

    const GLchar * fragmentStream = fragmentShaderCode.c_str();

    glShaderSource(vertexShaderId, 1, &vertexStream, NULL);
    glCompileShader(vertexShaderId);   

    glShaderSource(fragmentShaderId, 1, &fragmentStream, NULL);
    glCompileShader(fragmentShaderId);    

    glGetShaderiv(vertexShaderId, GL_COMPILE_STATUS, &status);
    glGetShaderiv(vertexShaderId, GL_INFO_LOG_LENGTH, &infoLogLength);
    std::vector<char> vertexShaderErrorMessage(infoLogLength);
    glGetShaderInfoLog(vertexShaderId, infoLogLength, NULL, &vertexShaderErrorMessage[0]);
    fprintf(stdout, "%s\n", &vertexShaderErrorMessage[0]);

    glGetShaderiv(fragmentShaderId, GL_COMPILE_STATUS, &status);
    glGetShaderiv(fragmentShaderId, GL_INFO_LOG_LENGTH, &infoLogLength);
    std::vector<char> fragmentShaderErrorMessage(infoLogLength);
    glGetShaderInfoLog(fragmentShaderId, infoLogLength, NULL, &fragmentShaderErrorMessage[0]);
    fprintf(stdout, "%s\n", &fragmentShaderErrorMessage[0]);

    glAttachShader(programId, vertexShaderId);
    glAttachShader(programId, fragmentShaderId);
    glLinkProgram(programId);
    glUseProgram(programId);

    glGetProgramiv(programId, GL_LINK_STATUS, &status);
    glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &infoLogLength);
    std::vector<char> programErrorMessage(std::max(infoLogLength, int(1)) );
    glGetProgramInfoLog(programId, infoLogLength, NULL, &programErrorMessage[0]);
    fprintf(stdout, "%s\n", &programErrorMessage[0]);

    glDeleteShader(vertexShaderId);
    glDeleteShader(fragmentShaderId);

    return programId;
    }

[顶点着色器]

#version 400

layout(location=0) in vec4 in_Position;
layout(location=1) in vec4 in_Color;
out vec4 ex_Color;

void main(void) {
    gl_Position = in_Position;
    ex_Color = in_Color;
}

片段着色器

#version 400

in vec4 ex_Color;
out vec4 out_Color;

void main(void) {
   out_Color = ex_Color;
}

最佳答案

只有当文件无法打开时,您才可以阅读这些文件。现在您正在将空字符串传递给 glShaderSource

更改 is_open 测试(更好的是,检查 good() 而不是 is_open()),事情可能会成功。

改变

std::ifstream vifs(vertex_file_path);
if(!vifs.is_open()) { // <<=== BACKWARDS!

    while (getline(vifs, line))
        vertexShaderCode += line + "\n";
    vifs.close();
}

{
    std::ifstream vifs(vertex_file_path);
    while(getline(vifs, line))
        vertexShaderCode += line +"\n";
}

由于您正在尝试读取整个文件,请查看 this question 中的一些更好的方法.

关于c++ - OpenGL 着色器拒绝链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11319608/

相关文章:

c++ - 倒置几何图形 gBuffer 位置用于透视。正字还好吗?

c++ - 尝试在 C++ 中使用 double 。不确定我哪里出错了

c++ - Redis pub/sub 序列化数据 struct C 数据

java - "lwjgl-util.jar"属于哪里?

math - 无递归的浮点幂函数

android - 如何在 Opengl es 2.x 中加载多个纹理(在带有 libgdx 的 android 中)

c++ - setQuitOnLastWindowClosed(true) : Is widget. hide() == widget.close()?

c++ - 如何从 QWizardPage 运行 QThread 并访问 field()

java - OpenGL 顶点着色器不工作

opengl - 我应该总是使用 GL_CULL_FACE 吗?