GLSL 4.5:为什么glGetAttribLocation找不到Color的“in”变量

时间:2015-10-25 07:32:40

标签: c++ opengl qt5

这是顶点着色器

#version 450

in vec3 iPosition;
in vec4 iColor;

out vec4 oColor;

uniform mat4 uMVP;

void main()
{
  oColor = iColor;
  gl_Position = uMVP * vec4(iPosition, 1.0);
}

这是片段着色器

#version 450

in vec4 iColor;

out vec4 oColor;

void main()
{
  oColor = iColor;
}

没有粘贴我的所有代码,这就是我所做的:

  1. 1)每次调用Open GL函数调用后,我都有glGetError。 在我在顶点着色器中的iColor变量上调用glGetAttribLocation之前,我没有错误。

  2. 在分别致电glCompileShaderglLinkProgram之后,我有以下代码:

  3. GLint isCompiled = 0;
    glGetShaderiv(m_fragmentShader, GL_COMPILE_STATUS, &isCompiled); GL_CALL
    if(isCompiled == GL_FALSE) {
      GLint maxLength = 0;
      glGetShaderiv(m_fragmentShader, GL_INFO_LOG_LENGTH, &maxLength); GL_CALL
      std::vector<GLchar> errorLog(maxLength);
      glGetShaderInfoLog(m_fragmentShader, maxLength, &maxLength, &errorLog[0]);
      GL_CALL
      std::stringstream out;
      std::copy(errorLog.begin(), errorLog.end(), std::ostream_iterator<char>(
        out, ""));
      qDebug() << out.str().c_str();
      glDeleteShader(m_fragmentShader); GL_CALL
      QCoreApplication::exit(-1);
    }
    
     GLint isLinked = 0;
     glGetProgramiv(m_shaderProgram, GL_LINK_STATUS, (int *)&isLinked);
     if(isLinked == GL_FALSE) {
       GLint maxLength = 0;
       glGetProgramiv(m_shaderProgram, GL_INFO_LOG_LENGTH, &maxLength); GL_CALL
       std::vector<GLchar> infoLog(maxLength);
       glGetProgramInfoLog(m_shaderProgram, maxLength, &maxLength, &infoLog[0]);
       GL_CALL
       std::stringstream out;
       std::copy(infoLog.begin(), infoLog.end(), std::ostream_iterator<char>(
         out, ""));
       qDebug() << out.str().c_str();
       glDeleteProgram(m_shaderProgram); GL_CALL
       glDeleteShader(m_vertexShader); GL_CALL
       glDeleteShader(m_fragmentShader); GL_CALL
       QCoreApplication::exit(-1);
     }
    
    1. 我试图将版本更改回150,但这会产生同样的错误。我知道有些实现会优化变量。但我显然是用这个来确定颜色。

    2. 我打算回到版本控制历史记录中,看看这个错误带来了什么变化,但这可能需要我一点。

    3. 如果有帮助,这里是绘图功能的简化版本:

      void Spline::draw()                          
      { 
        glUseProgram(m_shaderProgram); GL_CALL     
      
        GLint posAttrib = glGetAttribLocation(m_shaderProgram, "iPosition"); GL_CALL
        GLint colAttrib = glGetAttribLocation(m_shaderProgram, "iColor"); GL_CALL
      
        glBindBuffer(GL_ARRAY_BUFFER, m_vbo); GL_CALL 
        std::size_t stride = verts::traits::stride;
      
        std::size_t dimension1 = verts::datum_type::internal_type1::dimension; 
        std::size_t byte_offset1 = verts::traits::type1_byte_offset;
        glEnableVertexAttribArray(posAttrib); GL_CALL 
        glVertexAttribPointer(posAttrib, dimension1, GL_FLOAT, GL_FALSE,
          stride, (void*)byte_offset1); GL_CALL    
      
        std::size_t dimension2 = verts::datum_type::internal_type2::dimension; 
        std::size_t byte_offset2 = verts::traits::type2_byte_offset;
        glEnableVertexAttribArray(colAttrib); GL_CALL 
        glVertexAttribPointer(colAttrib, dimension2, GL_FLOAT, GL_FALSE,
          stride, (void*)byte_offset2); GL_CALL    
      
        opengl_math::matrix_4X4<float, opengl_math::column> model(
          opengl_math::identity);                  
        opengl_math::matrix_4X4<float, opengl_math::column> view =
          opengl_math::look_at<float, opengl_math::column>(
            opengl_math::point_3d<float>(0.0f, 0.0f, 20.0f),
            opengl_math::point_3d<float>(0.0f, 0.0f, 0.0f),
            opengl_math::vector_3d<float>(0.0f, 1.0f, 0.0f));
      
        GLint uniMVP = glGetUniformLocation(m_shaderProgram, "uMVP"); GL_CALL
        glUniformMatrix4fv(uniMVP, 1, GL_FALSE,    
          (m_projection * view * model).to_gl_matrix()); GL_CALL
      
        glDrawArrays(GL_LINE_STRIP, 0, m_vertexAttrib.get_attribute_count());
        GL_CALL
      }
      

1 个答案:

答案 0 :(得分:3)

您在两个着色器阶段都使用iColor作为输入名称。由于无法查询片段着色器属性,因此必须确保该着色器的名称是唯一的。您可以使用以下代码执行此操作:

顶点:

#version 450

in vec3 iPosition;
in vec4 iColor;

out vec4 xColor;

uniform mat4 uMVP;

void main()
{
    xColor = iColor;
    gl_Position = uMVP * vec4(iPosition, 1.0);
}

片段:

#version 450

in vec4 xColor;

out vec4 oColor;

void main()
{
    oColor = xColor;
}