【问题标题】:GLSL Attribute Location Returning -1GLSL 属性位置返回 -1
【发布时间】:2014-02-25 14:51:33
【问题描述】:

我显然误解了与 GLSL 相关的一些非常简单的事情,所有谷歌结果都指向一个明显的答案,即我没有使用我正在尝试查找的变量并且它已被优化 - 但是我正在使用有问题的变量。考虑以下非常基本着色器:

顶点着色器

attribute vec2 TexCoord;
varying vec2 TexCoordA;

void main(){
    gl_Position =  gl_ModelViewProjectionMatrix * gl_Vertex;
    TexCoordA = TexCoord;
}

片段着色器

varying vec2 TexCoordA;

void main(){
    gl_FragColor = vec3(TexCoordA.x, TexCoordA.y, 0); 
}

他们编译和链接很好 - 没有错误。但是,当我尝试找到“TexCoord”的位置时,使用“glGetAttribLocation”会返回 -1。如果我将 TexCoordA 用于其他目的(例如调用“texture2D()”),那么我能够正确找到 TexCoord 的位置。

您可能会问为什么这很重要(因为除了纹理调用之外,您为什么还要使用 UV 坐标)?我正在尝试将一个像素渲染到所有 UV 坐标的帧缓冲区中,然后在第二次通过时再次读取它们 - 这是我可以保证我正在寻找的结果的唯一方法。

TL;DR 为什么上面的着色器“glGetAttribLocation”返回-1,因为它们编译和链接没有问题?

请求的有关问题区域周围代码的信息如下(我正在以相同的方式加载大约 20-25 个其他着色器,因此我确信问题不在这里):

问题线:

    mPassOneProgram = LoadShader("PCT_UV_CORRECTION_PASS_1.vert", "PCT_UV_CORRECTION_PASS_1.frag");
    mPassOneUVLocation = glGetAttribLocation(mPassOneProgram, "TexCoord");

着色器加载器代码:

GLuint LoadShader(const char *vertex_path, const char *fragment_path) {
    GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
    GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);

    // Read shaders
    std::string vertShaderStr = readFile(vertex_path);
    std::string fragShaderStr = readFile(fragment_path);
    const char *vertShaderSrc = vertShaderStr.c_str();
    const char *fragShaderSrc = fragShaderStr.c_str();

    GLint result = GL_FALSE;
    int logLength;

    // Compile vertex shader
    std::cout << "Compiling vertex shader." << std::endl;
    glShaderSource(vertShader, 1, &vertShaderSrc, NULL);
    glCompileShader(vertShader);

    // Check vertex shader
    glGetShaderiv(vertShader, GL_COMPILE_STATUS, &result);
    glGetShaderiv(vertShader, GL_INFO_LOG_LENGTH, &logLength);
    std::vector<char> vertShaderError(logLength);
    glGetShaderInfoLog(vertShader, logLength, NULL, &vertShaderError[0]);
    std::cout << &vertShaderError[0] << std::endl;
    OutputDebugString(&vertShaderError[0]);

    // Compile fragment shader
    std::cout << "Compiling fragment shader." << std::endl;
    glShaderSource(fragShader, 1, &fragShaderSrc, NULL);
    glCompileShader(fragShader);

    // Check fragment shader
    glGetShaderiv(fragShader, GL_COMPILE_STATUS, &result);
    glGetShaderiv(fragShader, GL_INFO_LOG_LENGTH, &logLength);
    std::vector<char> fragShaderError(logLength);
    glGetShaderInfoLog(fragShader, logLength, NULL, &fragShaderError[0]);
    std::cout << &fragShaderError[0] << std::endl;
    OutputDebugString(&vertShaderError[0]);

    std::cout << "Linking program" << std::endl;
    GLuint program = glCreateProgram();
    glAttachShader(program, vertShader);
    glAttachShader(program, fragShader);
    glLinkProgram(program);

    glGetProgramiv(program, GL_LINK_STATUS, &result);
    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
    std::vector<char> programError( (logLength > 1) ? logLength : 1 );
    glGetProgramInfoLog(program, logLength, NULL, &programError[0]);
    std::cout << &programError[0] << std::endl;
    OutputDebugString(&vertShaderError[0]);

    glDeleteShader(vertShader);
    glDeleteShader(fragShader);

    return program;
}

【问题讨论】:

  • 您是在链接后询问吗?你可以在链接之前分配吗?我们可以在它失败的地方找到一些你的代码吗?
  • glsl 会优化未使用的变量,因此您无法找到它们。但是我在您的代码中没有看到这种情况。但是您的定义“如果我将 TexCoordA 用于其他目的(例如调用“texture2D()”),那么我能够正确找到 TexCoord 的位置。”听起来这就是原因
  • gl_FragColor 也不应该是 vec4 吗?可能是什么原因造成的?
  • 你怎么知道它们编译正确?你永远不会检查result
  • 另外我真的不明白你为什么使用“变化”,因为变化是 1.2 相当于 1.5 的变化。当我在codedstructure.net/projects/webgl_shader_lab 中尝试时,它不会编译

标签: c++ opengl glsl shader


【解决方案1】:

设法解决了这个问题

gl_FrontColor = vec3(TexCoord.x, TexCoord.y, 0)

在顶点着色器中和

gl_FragColor = gl_Color;

在片段着色器中。

这本质上是一样的,我仍然不明白为什么它以前不起作用。我将把它归结为编译器中的一个错误,因为其他人似乎无法找到问题。

【讨论】:

    【解决方案2】:
    glGetShaderiv(vertShader, GL_COMPILE_STATUS, &result);
    ...
    glGetShaderiv(fragShader, GL_COMPILE_STATUS, &result);
    ...
    glGetProgramiv(program, GL_LINK_STATUS, &result);
    

    每一个都应该跟一个检查以确保结果等于 GL_TRUE,否则着色器没有正确编译。有关完整的着色器/程序类集,请参阅 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      相关资源
      最近更新 更多