OpenGL:可能是错误的原因" ERROR :: SHADER :: PROGRAM :: LINKING_FAILED"?

时间:2016-11-11 02:38:47

标签: macos opengl xcode6 relative-path

最后我发现它的相对文件路径问题。 我的相对文件路径找不到片段代码文件和顶点代码文件。因此没有代码被发送到着色器。 我用绝对路径改变了相对文件路径,项目运行良好。

--------------------------------以下是关于我的项目的更多细节-------- -------------------------------

  • Xcode版本:6.1(6A1052c)

  • iOS版:OS X E Capitan 10.11.6(15G31)

  • GFX卡:Intel Iris 1536 MB

  • 顶点着色器代码:

    #version 330 core
    layout (location = 0) in vec3 position;
    layout (location = 1) in vec3 color;
    layout (location = 2) in vec2 texCoord;
    
    out vec3 ourColor;
    out vec2 TexCoord;
    
    void main()
    {
        gl_Position = vec4(position, 1.0);
        ourColor = color;
        TexCoord = vec2( texCoord.x , 1.0 - texCoord.y );
    }
    
  • 片段着色器代码:

    #version 330 core
    in vec3 ourColor;
    in vec2 TexCoord;
    
    out vec4 color;
    
    uniform sampler2D ourTexture1;
    
    void main()
    {
        color = texture(ourTexture1,TexCoord ) * vec4(ourColor,1.0);
    }
    

----------------------------------以下是我原来的问题-------- ---------------------------------------

我遇到了OpenGL编程的问题,控制台输出是这样的:

enter image description here

日志为空。

我已经多次检查过我的代码了,我真的不知道原因是什么。

所以有人能告诉我原因是什么吗?

以下是我的着色器代码:

#include <string>
#include <fstream>
#include <sstream>
#include <iostream>

#include <GL/glew.h>

class Shader
{
public:
GLuint Program;

// Constructor generates the shader on the fly
Shader( const GLchar *vertexPath, const GLchar *fragmentPath )
{
    // 1. Retrieve the vertex/fragment source code from filePath
    std::string vertexCode;
    std::string fragmentCode;
    std::ifstream vShaderFile;
    std::ifstream fShaderFile;
    // ensures ifstream objects can throw exceptions:
    vShaderFile.exceptions ( std::ifstream::badbit );
    fShaderFile.exceptions ( std::ifstream::badbit );
    try
    {
        // Open files
        vShaderFile.open( vertexPath );
        fShaderFile.open( fragmentPath );
        std::stringstream vShaderStream, fShaderStream;
        // Read file's buffer contents into streams
        vShaderStream << vShaderFile.rdbuf( );
        fShaderStream << fShaderFile.rdbuf( );
        // close file handlers
        vShaderFile.close( );
        fShaderFile.close( );
        // Convert stream into string
        vertexCode = vShaderStream.str( );
        fragmentCode = fShaderStream.str( );
    }
    catch ( std::ifstream::failure e )
    {
        std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
    }
    const GLchar *vShaderCode = vertexCode.c_str( );
    const GLchar *fShaderCode = fragmentCode.c_str( );
    // 2. Compile shaders
    GLuint vertex, fragment;
    GLint success;
    GLchar infoLog[512];

    // Vertex Shader
    vertex = glCreateShader( GL_VERTEX_SHADER );
    glShaderSource( vertex, 1, &vShaderCode, NULL );
    glCompileShader( vertex );
    // Print compile errors if any
    glGetShaderiv( vertex, GL_COMPILE_STATUS, &success );
    std::cout <<"Vertex::" << success << std::endl;
    if ( !success )
    {
        glGetShaderInfoLog( vertex, 512, NULL, infoLog );
        std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
    }

    // Fragment Shader
    fragment = glCreateShader( GL_FRAGMENT_SHADER );
    glShaderSource( fragment, 1, &fShaderCode, NULL );
    glCompileShader( fragment );
    // Print compile errors if any
    glGetShaderiv( fragment, GL_COMPILE_STATUS, &success );
    std::cout <<"Fragment::" << success << std::endl;
    if ( !success )
    {
        glGetShaderInfoLog( fragment, 512, NULL, infoLog );
        std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
    }

    // Shader Program
    this->Program = glCreateProgram( );
    glAttachShader( this->Program, vertex );
    glAttachShader( this->Program, fragment );
    glLinkProgram( this->Program );
    // Print linking errors if any
    glGetProgramiv( this->Program, GL_LINK_STATUS, &success );
    std::cout <<"linking::" << success << std::endl;

    if (!success)
    {
        glGetProgramInfoLog( this->Program, 512, NULL, infoLog );
        std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
    }
    // Delete the shaders as they're linked into our program now and no longer necessery
    glDeleteShader( vertex );
    glDeleteShader( fragment );

}
// Uses the current shader
void Use( )
{
    glUseProgram( this->Program );
}

};

1 个答案:

答案 0 :(得分:1)

最后我发现这是相对文件路径的问题。我的相对文件路径找不到片段代码文件和顶点代码文件。因此没有代码被发送到着色器。我用绝对路径改变了相对文件路径,项目运行良好。