为什么我的GLSL着色器失败汇编而没有错误消息



我正在使用OpenGL和C 构建游戏。我正在使用GLFW,很高兴。我目前正在设置简单的着色器,但是我完全被汇编问题所困扰。简而

这是我的顶点着色器(这是要绘制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;
}

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

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());
}

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

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

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

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

谢谢!

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

此行中的第二个参数:

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

告诉OpenGL将0代码字符串加载到着色器(Nothing(。将其更改为1,并且应该工作。

最新更新