【发布时间】: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。