首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的GLSL着色器在没有错误信息的情况下失败编译?

为什么我的GLSL着色器在没有错误信息的情况下失败编译?
EN

Stack Overflow用户
提问于 2018-03-30 08:26:13
回答 1查看 1.4K关注 0票数 3

我正在用OpenGL和C++构建一个游戏。我用的是GLFW和高兴。我目前正在建立简单的着色器,但我完全被一个编译问题所阻碍。简而言之,着色器编译失败,没有错误消息

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

代码语言:javascript
运行
复制
#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;
}

下面是创建着色器、加载着色器源代码、编译着色器和检查错误的相关代码。

代码语言:javascript
运行
复制
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提供的错误消息。据我所知,这个信息根本不存在。我已经在here上看到了这个问题,在这个问题上,问题是没有打电话给glCompileShader。如您所见,我的代码确实调用了该函数。

在试图解决这个问题时,我已经证实了一些事情。

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

有人知道怎么解决这个问题吗?正如我说的,我的进度是完全阻塞的,因为我不能渲染任何东西(2D或3D)没有工作着色器。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-30 08:37:21

问题是你从来没有上传任何着色器源到着色器。

这一行中的第二个参数:

代码语言:javascript
运行
复制
glShaderSource(shaderId, 0, &file, &length);

告诉OpenGL将0代码字符串加载到着色器(nothing)。将其更改为1,它就能工作了。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49570986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档