为什么我的GLSL着色器无法编译而没有错误消息?

Gri*_*ios 2 c++ opengl shader glsl glfw

我正在使用OpenGL和C++构建游戏.我正在使用GLFW和GLAD.我目前正在设置简单的着色器,但我完全被编译问题阻碍了.简而言之,着色器编译失败,没有错误消息.

这是我的顶点着色器(它用于绘制2D图像和文本):

#version 330 core

layout (location = 0) in vec2 vPosition;
layout (location = 1) in vec2 vTexCoords;
layout (location = 2) in vec4 vColor;

out vec4 fColor;
out vec2 fTexCoords;

uniform mat4 mvp;

void main()
{
    vec4 position = mvp * vec4(vPosition, 0, 1);
    position.y *= -1;

    gl_Position = position;
    fColor = vColor;
    fTexCoords = vTexCoords;
}
Run Code Online (Sandbox Code Playgroud)

这是创建着色器,加载着色器源,编译着色器以及检查错误的相关代码.

GLuint shaderId = glCreateShader(GL_VERTEX_SHADER);

std::string source = FileUtilities::ReadAllText(Paths::Shaders + filename);

GLchar const* file = source.c_str();
GLint length = static_cast<GLint>(source.size());

glShaderSource(shaderId, 0, &file, &length);
glCompileShader(shaderId);

GLint status;

glGetShaderiv(shaderId, GL_COMPILE_STATUS, &status);

if (status == GL_FALSE)
{
    GLint logSize = 0;

    glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &logSize);

    std::vector<GLchar> message = std::vector<GLchar>(logSize);

    glGetShaderInfoLog(shaderId, logSize, nullptr, &message[0]);
    glDeleteShader(shaderId);

    std::cout << std::string(message.begin(), message.end());
}
Run Code Online (Sandbox Code Playgroud)

使用该代码,logSize返回1,这意味着我无法访问GL提供的错误消息.据我所知,该消息根本不存在.我已经看到了这里发布的问题,其中的问题是缺少电话glCompileShader.如您所见,我的代码确实调用了该函数.

在试图解决这个问题时,我已经确认了一些事情.

  • 正在正确读取我的着色器源(字符串).源是一个单独的字符串,据我所知,它与实际的着色器文件完全匹配.
  • 有从字符串源没有铸造的问题GLchar const*GLint(变量filelength).两者看起来都正确
  • 如果我人为地夸大了logSize(比如1000)的值,那么结果消息就是零.没有错误消息.
  • glfwInit()在到达代码中的这一点之前,我正在调用和相关的函数.查询glGetString(GL_VERSION)确实正确返回目标版本(3.3.0).

有谁知道如何解决这一问题?正如我所说,我的进度完全被阻止,因为我无法渲染任何东西(2D或3D)而没有工作着色器.

谢谢!

BDL*_*BDL 6

问题是您永远不会将任何着色器源上载到着色器.

这一行的第二个参数:

glShaderSource(shaderId, 0, &file, &length);
Run Code Online (Sandbox Code Playgroud)

告诉OpenGL将0个代码字符串加载到着色器(无).将此更改为1,它应该工作.