c++ - 尝试从文件加载片段着色器时出错
问题描述
问题是这样的:像这样将我的着色器代码放在 std::string 中
std::string vertex_shader_source =
"#version 300 es\n"
"layout(location = 0) in vec4 verts;\n"
"void main(){\n"
" gl_Position = verts;\n"
"}\n";
std::string fragment_shader_source =
"#version 300 es\n"
"precision mediump float;"
"out vec3 color;\n"
"void main() {\n"
" color = vec3(1,0,0);\n"
"}\n";
工作得很好,程序没有报告错误,但是一旦我尝试从文件中加载完全相同的数据,片段着色器似乎编译得很好,但程序报告链接和验证时出错。返回的错误字符串要么为空白,要么充满垃圾,因此我也无法从中发现任何有用的信息。
我听说有人说这可能与 Windows 使用的行尾字符有关,但在 Linux 上重写代码后它根本没有改变。
我已经将我试图在pastebin 中工作的整个程序包含在此处,(我使用的着色器文件与 pastebin 中的文件完全相同,除了引号和换行符)我现在能猜到的是我在第 93 行的 Renderer::compile_shader_from_file() 方法中读取文件的方式有问题,但是每当我尝试将其加载到单独的程序中并检查字符串的内容时,它看起来都很好。
解决方案
在该方法Renderer::compile_shader_from_file
中,创建了 2 个着色器对象(glCreateShader
被调用两次)。最后从方法返回“错误”对象:
unsigned int Renderer::compile_shader_from_file(const std::string& file_path, GLenum shader_type) { std::ifstream shader_source_file(file_path); unsigned int shader = glCreateShader(shader_type); if(shader_source_file.is_open()) { // [...] unsigned int shader = glCreateShader(shader_type); // [...] } shader_source_file.close(); return shader; }
仅创建 1 个对象,以解决问题:
unsigned int Renderer::compile_shader_from_file(const std::string& file_path, GLenum shader_type) {
std::ifstream shader_source_file(file_path);
unsigned int shader = 0; // <---
if(shader_source_file.is_open()) {
// [...]
shader = glCreateShader(shader_type); // <---
// [...]
}
shader_source_file.close();
return shader;
}
推荐阅读
- visual-studio - 无法修改 NuGet 包
- security - 可以使用 oauth2 流程进行基于电子邮件的注册吗?
- android - Android Socket 实时读取
- javascript - CSS(多个ID)+(类)的正确语法是什么
- android - 如何使用 Kotlin 合成访问 RecyclerView ListItem 中的第 n 个项目
- amazon-web-services - terraform 中的 aws_launch_configuration 中的 source_dest_check
- python - 如何聚合字典列表中的某些元素
- go - 如何在 Go 中将文件压缩为没有目录文件夹的 .zip
- excel - VBA代码在可见单元格中粘贴特殊值
- api - Twiitter python API 无法连接流式传输