Opengl 将一致性传递给顶点着色器会导致其不渲染四边形

Opengl 将一致性传递给顶点着色器会导致其不渲染四边形,opengl,shader,opengl-3,vertex-shader,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 camera类,因此可以实现屏幕旋转和缩放。我发现,当我以统一的形式通过4x4矩阵时,所有内容都停止渲染(或可见) 通过

我正在使用OpenGL 3.2进行一个2D项目,我有以下非常简单的顶点着色器

#version 150

in vec2 pos;

void main() { 
    gl_Position = vec4(pos.x, pos.y, 0, 1); 
}
然后使用数组和索引缓冲区,我在屏幕上画了一个简单的四元组,一切正常。当我想要传递一个变换矩阵时,问题就来了。这来自2D camera类,因此可以实现屏幕旋转和缩放。我发现,当我以统一的形式通过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
传递到glUniform*调用的第一个参数中

i、 e


问题是您在错误的位置设置了值。您应该调用,而不是将
0
传递到glUniform*调用的第一个参数中

i、 e


问题是您在错误的位置设置了值。您应该调用,而不是将
0
传递到glUniform*调用的第一个参数中

i、 e


问题是您在错误的位置设置了值。您应该调用,而不是将
0
传递到glUniform*调用的第一个参数中

i、 e


在使用
glGetError()
gluErrorString()
执行了一些进一步的调查之后,我发现它抛出了一个
glu无效\u操作。不幸的是,这有点模糊,但我很幸运地遇到了其他人有同样的问题


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

在使用
glGetError()
gluErrorString()
执行了一些进一步的调查之后,我发现它抛出了一个
glu无效\u操作。不幸的是,这有点模糊,但我很幸运地遇到了其他人有同样的问题


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

在使用
glGetError()
gluErrorString()
执行了一些进一步的调查之后,我发现它抛出了一个
glu无效\u操作。不幸的是,这有点模糊,但我很幸运地遇到了其他人有同样的问题


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

在使用
glGetError()
gluErrorString()
执行了一些进一步的调查之后,我发现它抛出了一个
glu无效\u操作。不幸的是,这有点模糊,但我很幸运地遇到了其他人有同样的问题


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

我实际上存储了统一的位置并传递了变量。为了简单起见,我在示例中使用了0,因为这是调试时传递的。这很奇怪,你的代码对我来说很无害。需要确保的几件事:确保捕捉到任何着色器编译错误。检查glGetErrors。确保
m
为GLFloat类型且连续。如果您已经完成了所有这些,您可以尝试将MVP中的值发送到片段着色器中,以便可以将它们作为颜色进行调试。除此之外,恐怕我帮不了忙。我确实存储了统一的位置并传递了变量。为了简单起见,我在示例中使用了0,因为这是调试时传递的。这很奇怪,你的代码对我来说很无害。需要确保的几件事:确保捕捉到任何着色器编译错误。检查glGetErrors。确保
m
为GLFloat类型且连续。如果您已经完成了所有这些,您可以尝试将MVP中的值发送到片段着色器中,以便可以将它们作为颜色进行调试。除此之外,恐怕我帮不了忙。我确实存储了统一的位置并传递了变量。为了简单起见,我在示例中使用了0,因为这是调试时传递的。这很奇怪,你的代码对我来说很无害。需要确保的几件事:确保捕捉到任何着色器编译错误。检查glGetErrors。确保
m
为GLFloat类型且连续。如果您已经完成了所有这些,您可以尝试将MVP中的值发送到片段着色器中,以便可以将它们作为颜色进行调试。除此之外,恐怕我也帮不了忙。我确实储存了制服的位置并通过了t
GLint mvpLocation = glGetUniformLocation(program, "MVP");
// ...
glUniformMatrix4fv(mvpLocation, 1, GL_FALSE, &m[0][0]);