链接着色器导致文件未读取错误
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 V
和 F
?您是否已验证 vShaderCode
和 fShaderCode
包含合理字符串?
你好@genpfault,转义斜线是我的错,谢谢你纠正这个问题,关于着色器不包含任何字符串(对不起,如果我没有正确的话)。
对于那些感兴趣的人,我找到了一条我现在正在遵循的路径,我更改了该人用于其主 .cpp 文件的代码,并且在我使用该代码之后,没有错误.所以我猜这是我做的事情,我会将答案发布给那些想知道的人,希望这对那些有同样问题的人有所帮助。
【参考方案1】:
好吧,所以在测试了这么多东西后我找到了解决方案:
所以对于链接文件总是有正确的文件夹路径,
Shader ourShader("Source/Shaders/Shader.vert", "Source/Shaders/Shader.frag");
另外我发现我的GLEW在我使用这个功能之前没有初始化,这也导致了错误,希望我的解决方案对有同样问题的人有所帮助。
【讨论】:
以上是关于链接着色器导致文件未读取错误的主要内容,如果未能解决你的问题,请参考以下文章