C++ GLSL属性位置返回-1

C++ GLSL属性位置返回-1,c++,opengl,glsl,shader,C++,Opengl,Glsl,Shader,我显然误解了GLSL的一些非常简单的问题,所有谷歌结果都指向了一个明显的答案,即我没有使用我试图找到的变量,并且它已经优化了——但是我使用的是有问题的变量。考虑下面的非常/强>基本着色器: 顶点着色器 attribute vec2 TexCoord; varying vec2 TexCoordA; void main(){ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; TexCoordA = TexCoord;

我显然误解了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); 
}
片段着色器

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”的位置时,使用“GLGetAttriblLocation”返回-1。如果我将TexCoordA用于其他目的(例如调用“texture2D()”),那么我就能够正确地找到TexCoord的位置

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

TL;博士 既然上面的着色器编译和链接没有问题,为什么“glGetAttriblLocation”会返回-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;
}
着色器加载程序代码:

    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;
}
GLuint LoadShader(常量字符*顶点路径,常量字符*片段路径){
GLuint vertShader=glCreateShader(GL_VERTEX_SHADER);
GLuint fragShader=glCreateShader(GL_FRAGMENT_SHADER);
//读取着色器
std::string vertShaderStr=readFile(顶点路径);
std::string fragShaderStr=readFile(片段路径);
const char*vertShaderSrc=vertShaderStr.c_str();
常量char*fragShaderSrc=fragShaderStr.c_str();
闪烁结果=GLU FALSE;
整数对数长度;
//编译顶点着色器
标准::cout

每项操作之后都应进行检查,以确保结果等于GL_TRUE,否则着色器未正确编译。有关完整的着色器/程序类集,请参阅。

通过执行以下操作解决了此问题

gl_FrontColor = vec3(TexCoord.x, TexCoord.y, 0)
在顶点着色器和

gl_FragColor = gl_Color;
在片段着色器中


这基本上是同一件事,我仍然不明白为什么它以前不起作用。我将把这一点归结为编译器中的一个错误,因为似乎没有其他人能够找到问题。

你是在链接后问问题吗?你能在链接前分配吗?我们能知道你的一些代码在哪里失败吗?glsl优化变量如果没有使用它们,那么您就无法找到它们。但是我在您的代码中没有看到这种情况。但是您的定义“如果我将TexCoordA用于其他目的(例如调用“texture2D()”),那么我就能够正确找到TexCoord的位置。”听起来这就是为什么gl_FragColor不应该是vec4?也许是某种原因造成的?你怎么知道它们编译正确?你从来没有检查过
结果
。而且我真的不明白为什么你使用“variable out”,因为variable是1.2等同于1.5的out。当我尝试时,它不会编译