链接着色器导致文件未读取错误

Posted

技术标签:

【中文标题】链接着色器导致文件未读取错误【英文标题】:Linking a Shader results in an error of file not being read 【发布时间】:2021-05-17 23:04:18 【问题描述】:

我的问题始于我的着色器,特别是未链接顶点着色器,我目前正在遵循 LearnOpenGL 代码指南。

ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ
ERROR::PROGRAM_LINKING_ERROR of type: PROGRAM
Vertex info
-----------
(0) : error C5145: must write to gl_Position

这是我的 shader.vert 文件-

#version 330 core
layout (location = 0) in vec3 aPos;
void main()

  gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);

一个非常简单的 vert 文件,我可以使用 strings 方法实现这一点,但是从文件读取时问题就开始了。

这里是shader.frag文件-

#version 330 core
out vec4 FragColor;

in vec4 vertexColor; // the input variable from the vertex shader (same     
 name and same type)  

void main()

    FragColor = vertexColor;

这是从 LearnOpenGL 读取文件的 .h 文件,据我所知,这个文件不是问题。

#include <GL/glew.h>
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>

class Shader

    public:
    unsigned int ID;
// constructor generates the shader on the fly
// ------------------------------------------------------------------------
Shader(const char* vertexPath, const char* fragmentPath)

    // 1. retrieve the vertex/fragment source code from filePath
    std::string vertexCode;
    std::string fragmentCode;
    std::ifstream vShaderFile;
    std::ifstream fShaderFile;
    // ensure ifstream objects can throw exceptions:
    vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
    fShaderFile.exceptions(std::ifstream::failbit | 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 char* vShaderCode = vertexCode.c_str();
    const char* fShaderCode = fragmentCode.c_str();
    // 2. compile shaders
    unsigned int vertex, fragment;
    // vertex shader
    vertex = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex, 1, &vShaderCode, NULL);
    glCompileShader(vertex);
    checkCompileErrors(vertex, "VERTEX");
    // fragment Shader
    fragment = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragment, 1, &fShaderCode, NULL);
    glCompileShader(fragment);
    checkCompileErrors(fragment, "FRAGMENT");
    // shader Program
    ID = glCreateProgram();
    glAttachShader(ID, vertex);
    glAttachShader(ID, fragment);
    glLinkProgram(ID);
    checkCompileErrors(ID, "PROGRAM");
    // delete the shaders as they're linked into our program now and no longer necessary
    glDeleteShader(vertex);
    glDeleteShader(fragment);

// activate the shader
// ------------------------------------------------------------------------
void use()

    glUseProgram(ID);

// utility uniform functions
// ------------------------------------------------------------------------
void setBool(const std::string& name, bool value) const

    glUniform1i(glGetUniformLocation(ID, name.c_str()), (int)value);

// ------------------------------------------------------------------------
void setInt(const std::string& name, int value) const

    glUniform1i(glGetUniformLocation(ID, name.c_str()), value);

// ------------------------------------------------------------------------
void setFloat(const std::string& name, float value) const

    glUniform1f(glGetUniformLocation(ID, name.c_str()), value);


private:
// utility function for checking shader compilation/linking errors.
// ------------------------------------------------------------------------
void checkCompileErrors(unsigned int shader, std::string type)

    int success;
    char infoLog[1024];
    if (type != "PROGRAM")
    
        glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
        if (!success)
        
            glGetShaderInfoLog(shader, 1024, NULL, infoLog);
            std::cout << "ERROR::SHADER_COMPILATION_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl;
        
    
    else
    
        glGetProgramiv(shader, GL_LINK_STATUS, &success);
        if (!success)
        
            glGetProgramInfoLog(shader, 1024, NULL, infoLog);
            std::cout << "ERROR::PROGRAM_LINKING_ERROR of type: " << type << "\n" << infoLog << "\n - 
 - --------------------------------------------------- -- " << std::endl;
            
        
    
;

我不确定我尝试了多少种不同的方法来链接文件,用不同的名称重命名它们,使用完整路径和相对路径,但仍然无法找到解决方案。

Shader ourShader("Shaders/shader.vert","Shaders/shader.frag");

【问题讨论】:

为什么要在 ourShader 声明中尝试 escape VF?您是否已验证 vShaderCodefShaderCode 包含合理字符串? 你好@genpfault,转义斜线是我的错,谢谢你纠正这个问题,关于着色器不包含任何字符串(对不起,如果我没有正确的话)。 对于那些感兴趣的人,我找到了一条我现在正在遵循的路径,我更改了该人用于其主 .cpp 文件的代码,并且在我使用该代码之后,没有错误.所以我猜这是我做的事情,我会将答案发布给那些想知道的人,希望这对那些有同样问题的人有所帮助。 【参考方案1】:

好吧,所以在测试了这么多东西后我找到了解决方案:

所以对于链接文件总是有正确的文件夹路径,

Shader ourShader("Source/Shaders/Shader.vert", "Source/Shaders/Shader.frag");

另外我发现我的GLEW在我使用这个功能之前没有初始化,这也导致了错误,希望我的解决方案对有同样问题的人有所帮助。

【讨论】:

以上是关于链接着色器导致文件未读取错误的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 程序着色器链接错误

oc渲染器提示着色器失败

使用结构从 .txt 文件中读取着色器

OpenGL着色器程序在使用时导致屏幕变黑

我应该把我的着色器代码放在哪里?

java lwjgl 2着色器错误