【问题标题】:glGetAttribLocation returns -1 [closed]glGetAttribLocation 返回 -1 [关闭]
【发布时间】:2018-03-06 08:50:43
【问题描述】:

我开始学习着色器时遇到了函数 glGetAttribLocation 返回 -1 的问题。

programId >= 0

顶点和片段着色器 >= 0

位置和颜色属性 == -1

这是我的代码:

着色器:

int[] shaderData = createShaderProgram(gl, "in vec3 color;\n" + 
                "\n" + 
                "out vec4 outColor;\n" + 
                "\n" + 
                "void main()\n" + 
                "{\n" + 
                "    outColor = vec4(color.x, color.y, color.z, 1.0);\n" + 
                "}", 

                "in vec3 inColor;\n" + 
                "in vec3 inPosition;\n" + 
                "\n" + 
                "out vec3 color;\n" + 
                "\n" + 
                "void main()\n" + 
                "{\n" + 
                "    gl_Position = vec4(inPosition, 1.0);\n" + 
                "   color = inColor;\n" + 
                "}");
        programId = shaderData[0];
        vertexShader = shaderData[1];
        fragmentShader = shaderData[2];
        gl.glUseProgram(programId);

        int positionAttribute = gl.glGetAttribLocation(programId, "inPosition");
        int colorAttribute = gl.glGetAttribLocation(programId, "inColor");
        System.out.println(positionAttribute + "; " + colorAttribute); // -1; -1

以及createShaderProgram函数:

private int[] createShaderProgram(GL2 gl, String fragment, String vertex) {
        int v = gl.glCreateShader(GL2.GL_VERTEX_SHADER);
        int f = gl.glCreateShader(GL2.GL_FRAGMENT_SHADER);

        gl.glShaderSource(v, 1, new String[] {vertex}, null);
        gl.glCompileShader(v);

        gl.glShaderSource(f, 1, new String[] {fragment}, null);
        gl.glCompileShader(f);

        int shaderprogram = gl.glCreateProgram();
        gl.glAttachShader(shaderprogram, v);
        gl.glAttachShader(shaderprogram, f);
        gl.glLinkProgram(shaderprogram);
        gl.glValidateProgram(shaderprogram);

        return new int[] {shaderprogram, v, f};
    }

【问题讨论】:

  • 你检查 GL_COMPILE_STATUS 和 glGetShaderInfoLog 了吗?
  • 如果您的着色器包含错误,它将无法编译或链接,因此找不到位置。制服也是如此,但如果不使用它们,它们也可以由驱动程序进行优化......你应该检查glGetShaderInfoLog有你需要知道的所有东西来解决这个问题。另请参阅simple complete GL+VAO/VBO+GLSL+shaders example in C++ 可能有帮助
  • @DBCongard 是的,您使用的是旧的 GLSL 1.0,因为您没有使用 #version。因此,当您使用较新的东西时,它不是有效的代码。再次查看链接并查看我的着色器的第一行......你不需要核心,但你需要设置你想要至少使用#version 110#version 110 core的GLSL版本或#version 110 compatibility
  • @DBCongard 他们与在驱动程序中编译的着色器无关,您的 opengl 代码不是。唯一可能成为问题的是核心配置文件不兼容,因为在较新版本的 GL 中,旧的 glBegin/glEnd 已弃用(但仍可在 nVidia 上使用),您应该改用 VBO/VAO。试试看,你会看到...... GLSL 1.3 并不意味着 GL 1.3 !!! IIRC 在哪里有 GL 文档中的 GL 与 GLSL 版本表...
  • 仅供参考...关于OpenGL version versus GLSL version

标签: java opengl shader jogl


【解决方案1】:

解决方案:将#version 添加到着色器的开头。在这种情况下,这是#version 130

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多