【问题标题】:Vertex shader not passing value to fragment shader顶点着色器没有将值传递给片段着色器
【发布时间】:2015-11-20 09:58:50
【问题描述】:

我遇到了以下问题:

我得到了这个顶点着色器:

#version 410 core

in vec3 vertex_position;

out vec3 color;

void main()
{
    color = vec3(0.0, 0.0, 0.0);
    gl_Position = vec4(vertex_position, 1.0);
}

以及以下片段着色器:

#version 410 core

in vec3 color;

out vec4 frag_color;

void main()
{
    frag_color = vec4(color, 1.0);
}

我想将颜色向量从顶点着色器传递到碎片着色器,但是屏幕上没有显示任何内容。当我在片段着色器中设置 frag_color 时,如: frag_color = vec4(0.0, 0.0, 0.0, 1.0);有用。因此,在两个阶段之间传递值的东西一定是错误的。

这是我的着色器代码:

void Shader::CreateShaders(std::string filePathVert, std::string filePathFrag)
{
    // setup shaders
    std::string vertex_shader_source   = LoadSourceFile(filePathVert);
    std::string fragment_shader_source = LoadSourceFile(filePathFrag);
    const GLchar* vs_source = vertex_shader_source.c_str();
    const GLchar* fs_source = fragment_shader_source.c_str();

    GLuint vs = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vs, 1, &vs_source, NULL);
    glCompileShader(vs);
    CheckShaderError(vs, GL_COMPILE_STATUS, false, "Error: Shader compilation failed: ");

    GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fs, 1, &fs_source, NULL);
    glCompileShader(fs);
    CheckShaderError(fs, GL_COMPILE_STATUS, false, "Error: Shader compilation failed: ");

    this->shader_program = glCreateProgram();
    glAttachShader(this->shader_program, fs);
    glAttachShader(this->shader_program, vs);
    glLinkProgram(this->shader_program);
    CheckValidationError(this->shader_program);

    glDeleteShader(vs);
    glDeleteShader(fs);
}

void Shader::Bind()
{
    glUseProgram(this->shader_program);
}

void Shader::Destroy()
{
    glDeleteProgram(this->shader_program);
}

static std::string LoadSourceFile(std::string filePath)
{
    std::ifstream ifs(filePath);
    std::string content( (std::istreambuf_iterator<char>(ifs) ),
                        (std::istreambuf_iterator<char>()    ) );

    if(content.empty())
    {
        std::cerr << "source file was empty or not correctly loaded\n";
    }

    return content;
}

还有我的绘图代码:

GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, vbo_positions);
glVertexAttribPointer(glGetAttribLocation(shader.GetProgramID(), "vertex_position"), 3, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, vbo_colors);
glVertexAttribPointer(glGetAttribLocation(shader.GetProgramID(), "vertex_color"), 3, GL_FLOAT, GL_FALSE, 0, NULL);


while(!glfwWindowShouldClose(display.GetWindowID())) {
    display.UpdateFPSCounter();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    shader.Bind();
    glBindVertexArray(vao);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    update();

    glfwSwapBuffers(display.GetWindowID());
    display.CheckWindowShouldClose();
}

有人看到我做错了吗?

提前致谢!

【问题讨论】:

  • 一个问题是您使用0 作为glEnableVertexAttribArray() 的参数。这仅在位置为 0 时有效。为安全起见,您应该使用实际位置,就像对 glVertexAttribPointer() 所做的那样。

标签: c++ opengl shader


【解决方案1】:

vertex_color 与您的顶点着色器中的变量不匹配。

【讨论】:

  • 这意味着他可能遗漏了导致错误的代码。
  • 一点也不。看glVertexAtttribPointer
  • ...是吗?他还没有在他的例子中使用它。
  • 起初,我想将颜色从代码传递到顶点着色器,然后从那里传递到片段着色器,这就是为什么 vertex_color 属性指针仍在着色器代码中的原因。由于它不起作用,我试图找出问题所在,并删除了顶点着色器中的变量,以将其直接从那里传递给片段着色器。另外,当我用颜色注释掉两条线时,三角形不会出现
  • 朋友,您要么将顶点着色器(和片段着色器)中的变量从color 更改为vertex_color,要么将主程序中指向的变量从vertex_color 更改为@ 987654326@。这并不难,而且我相信变量不匹配是导致您的问题的原因。
【解决方案2】:

问题出在这里:

glEnableVertexAttribArray(0);
glVertexAttribPointer(glGetAttribLocation(shader.GetProgramID(), "vertex_position"),
                      3, GL_FLOAT, GL_FALSE, 0, NULL);

这两个调用都将属性位置作为第一个参数。虽然位置的位置可能恰好为 0,但这并不能保证,您应该将相同的参数传递给这两个调用:

GLuint posLoc = glGetAttribLocation(shader.GetProgramID(), "vertex_position");
glEnableVertexAttribArray(posLoc);
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, NULL);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多