我正在使用OpenGL 3.2进行2D项目,我有以下非常简单的顶点着色器
#version 150
in vec2 pos;
void main() {
gl_Position = vec4(pos.x, pos.y, 0, 1);
}
然后使用数组和索引缓冲区我在屏幕上绘制一个简单的四边形,一切正常。当我想传入转换矩阵时,问题就来了。这来自2D相机类,因此可以实现屏幕旋转和缩放。我发现的是,一旦我传入4x4矩阵作为制服,一切都停止渲染(或可见)。
通过代码后,我可以看到,在更新制服时,传入的矩阵是一个4x4单位矩阵,正如预期的那样,因为相机没有做任何特殊的事情。我希望应用单位矩阵应该产生相同的结果,就好像它根本没有相乘。
更新的着色器如下:
#version 150
in vec2 pos;
uniform mat4 MVP;
void main() {
gl_Position = MVP * vec4(pos.x, pos.y, 0, 1);
}
使用glUniformMatrix4fv(mvpPos, 1, GL_FALSE, &m[0][0]);
我不知道为什么会发生这种情况,所以我会很感激。我知道没有发布任何代码,但我很乐意发布任何特定的部分进行查看,我不想让最初的问题陷入可能无关代码的墙上。
更新:我已经测试过在着色器中直接使用单位矩阵的值声明mat4
。用这个矩阵替换MVP意味着它可以解决通过glUniformMatrix4fv更新统一的问题。
答案 0 :(得分:2)
问题是您将值设置在错误的位置。你应该调用glGetUniformLocation
而不是将0
传递给glUniform *调用的第一个参数。
即。
GLint mvpLocation = glGetUniformLocation(program, "MVP");
// ...
glUniformMatrix4fv(mvpLocation, 1, GL_FALSE, &m[0][0]);
答案 1 :(得分:1)
在使用glGetError()
和gluErrorString()
进行进一步调查后,我发现它正在投掷GL_INVALID_OPERATION
。不幸的是,这有点模糊,但我很幸运能遇到有同样问题的其他人。
就像我之前忘记绑定程序一样简单,因为之前我只是在渲染中完成了更新制服,而不需要在任何更新中使用着色器。