OpenGL GLSL着色器程序无法链接问题求助
着色器链接失败问题排查与解决
我编写了一个基础的OpenGL GLSL着色器程序,着色器加载器已成功加载着色器文件,但尝试将着色器链接到程序时持续报错,仅提示WARNING: COULD NOT LINK PROGRAM,程序未抛出异常。后续确认问题由笔误导致,现已解决。
着色器加载器代码
#include "Shaders.h" #include <fstream> #include <sstream> #include <iostream> namespace myEngine { bool Shaders::LoadShader(std::string _path, std::string _type) { std::fstream file(_path); char* shadersSrc = nullptr; if (file.is_open()) { file.seekg(0, file.end); int length = (int)file.tellg(); file.seekg(0, file.beg); shadersSrc = new char[length]; file.read(shadersSrc, length); if (!file.eof()) { file.close(); std::cerr << "WARNING: COULD NOT READ SHADER" << std::endl; return false; } length = (int)file.gcount(); shadersSrc[length] = 0; file.close(); } else { std::cerr << "WARNING: COULD NOT OPEN SHADER" << std::endl; return false; } if (_type == "vertex") { m_vertexShaderId = glCreateShader(GL_VERTEX_SHADER); glShaderSource(m_vertexShaderId, 1, &shadersSrc, NULL); glCompileShader(m_vertexShaderId); if (!CheckShader(m_vertexShaderId)) return false; } else if (_type == "fragment") { m_fragmentShaderId = glCreateShader(GL_VERTEX_SHADER); glShaderSource(m_fragmentShaderId, 1, &shadersSrc, NULL); glCompileShader(m_fragmentShaderId); if (!CheckShader(m_fragmentShaderId)) return false; } return true; } bool Shaders::LinkShaders() { m_programId = glCreateProgram(); glAttachShader(m_programId, m_vertexShaderId); glAttachShader(m_programId, m_fragmentShaderId); glBindAttribLocation(m_programId, 0, "in_position"); glLinkProgram(m_programId); glGetProgramiv(m_programId, GL_LINK_STATUS, &m_success); if (!m_success) { std::cerr << "WARNING: COULD NOT LINK PROGRAM" << std::endl; //throw std::exception(); return false; } glDetachShader(m_programId, m_vertexShaderId); glDeleteShader(m_vertexShaderId); glDetachShader(m_programId, m_fragmentShaderId); glDeleteShader(m_fragmentShaderId); return true; } bool Shaders::CheckShader(GLuint _id) { glGetShaderiv(_id, GL_COMPILE_STATUS, &m_success); if (!m_success) { std::cerr << "WARNING: COULD NOT COMPILE SHADER" << std::endl; throw std::exception(); return false; } return true; }
片段着色器代码
#version 330 core out vec4 FragColor; void main() { FragColor = vec4(0.0, 0.0, 1.0, 1.0); }
顶点着色器代码
#version 330 core layout(location = 0) in vec3 in_position; void main() { gl_Position = vec4(in_position, 1.0); }
问题原因与解决
代码中的关键笔误出现在加载片段着色器的分支中:创建着色器时错误使用了GL_VERTEX_SHADER枚举值,正确应为GL_FRAGMENT_SHADER。修改后程序即可正常链接。
内容的提问来源于stack exchange,提问作者andrew
相关产品推荐
相关产品推荐

