You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:50:27