将制服传递到顶点着色器会导致它不渲染四边形

时间:2014-09-26 15:56:06

标签: opengl shader opengl-3 vertex-shader

我正在使用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更新统一的问题。

2 个答案:

答案 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。不幸的是,这有点模糊,但我很幸运能遇到有同样问题的其他人。

就像我之前忘记绑定程序一样简单,因为之前我只是在渲染中完成了更新制服,而不需要在任何更新中使用着色器。