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

GLSL着色器程序链接失败求助:编译正常无报错日志

GLSL着色器链接失败排查(编译成功但链接日志为空)

我遇到GLSL着色器程序无法正常链接的问题,着色器编译成功但链接日志为空。调用以下代码:

CompileShaders("Data/Shaders/ui", 0b01, MainUiShader);

时提示错误:

ERROR: Cant link shaders

相关函数头文件代码

void CompileShader(std::string ShaderFile, GLenum ShaderType, GLuint ShaderVariable) {
    LoadFile(ShaderFile);
    ShaderVariable = glCreateShader(ShaderType);
    const char* ShaderSource = TempData0.c_str();
    glShaderSource(ShaderVariable, 1, &ShaderSource, NULL);
    glCompileShader(ShaderVariable);

    glGetShaderiv(ShaderVariable, GL_COMPILE_STATUS, &TempValue);
    if (!TempValue)
    {glGetShaderInfoLog(ShaderVariable, 4096, NULL, Log);
            std::cout << "ERROR: shader compilation fail\n";
            std::cout << Log << std::endl;}
    else {std::cout << "Shader compiled\n";}}

void CompileShaders(std::string ShaderFile, int8_t ShaderTypes, GLuint ShaderVariable) 
{
    ShaderVariable = glCreateProgram();
    if ((0b01 & ShaderTypes) > 0) {
        CompileShader(ShaderFile.append(".vsh"), GL_VERTEX_SHADER, Stemp[0]);
        glAttachShader(ShaderVariable, Stemp[0]);
        std::cout << ShaderFile;
        ShaderFile = ShaderFile.substr(0, ShaderFile.size() - 4);}
        CompileShader(ShaderFile.append(".fsh"), GL_FRAGMENT_SHADER, Stemp[2]);
        glAttachShader(ShaderVariable, Stemp[2]);
        std::cout << ShaderFile;

    glLinkProgram(ShaderVariable);
    glGetProgramiv(ShaderVariable, GL_LINK_STATUS, &TempValue);
    if (!TempValue) {
        std::cout << "ERROR: Cant link shaders";
        glGetProgramInfoLog(ShaderVariable, 512, NULL, Log);
        std::cout<<Log;
    }
}

主程序代码

#include "main.h"
int main()
{
//GLFWInitialization:
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    ResetWindow();

    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }

    glGenBuffers(1, &VBO);
    glGenVertexArrays(1, &VAO);

    CompileShaders("Data/Shaders/ui", 0b00, MainUiShader);

    while (Window) {
        if (glfwWindowShouldClose(Window)) { glfwTerminate(); return 0; }
        glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glBindBuffer(GL_ARRAY_BUFFER, VBO);
        glBindVertexArray(VAO);
        glBufferData(GL_ARRAY_BUFFER, sizeof(position), position, GL_DYNAMIC_DRAW);

        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float),
            (void*)0);
        glEnableVertexAttribArray(0);

        glUseProgram(MainUiShader);

        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        glfwSwapBuffers(Window);
        glfwPollEvents();
    }
    
}

着色器代码

ui.fsh(片段着色器)

#version 330 core

out vec4 FragColor;

void main()
{
    FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}

ui.vsh(顶点着色器)

#version 330 core

layout (location = 0) in vec3 position;

void main()
{
    gl_Position = vec4(position.x + 0.5, position.y, position.z, 1.0);
}

所有变量已正确定义,OpenGL初始化正常。本应绘制橙色三角形,但因片段着色器无法工作而显示为黑色,恳请帮忙排查链接失败原因。

内容的提问来源于stack exchange,提问作者BlastFurnace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 09:25:58