在GLSL中设置矩阵无效

4

I have this shader code (GLSL):

#version 420

in vec4 vertex;

uniform mat4 modelViewMatrix;
uniform mat4 projectionMatrix;

void main()
{
    gl_Position = modelViewMatrix * projectionMatrix * vertex;
}

如果我不设置modelViewMatrix和projectionMatrix,程序可以正常运行。但如果我这么做了,当我尝试绘制时,OpenGL会抛出Invalid Operation异常。
我使用以下代码来设置矩阵:
glUniformMatrix4fv(location, 1, false, sendArray);
我已经验证“location”和“sendArray”包含正确的数据。这里发生了什么?
编辑:问题似乎出在glUniformMatrix4fv调用中,但我不知道哪里出了问题。
设置“location”的代码如下:
GLint location;
GLint location = glGetUniformLocation(this->programID, uniform.c_str());

if (location == -1)
{
    throw ShaderVariableNotFoundException(uniform, this->programID);
}


我无法设置在GLSL中未使用的值,因为编译器会优化掉这些变量。如果我尝试设置一个在着色器中没有使用的值,OpenGL会告诉我找不到这个变量。 - Publius
我检查了位置确保它是有效的。它不是-1或任何其他值。 - Publius
1
能把整个代码展示一下吗? - xiaoyi
我现在展示了设置位置的代码,如果你所说的“整个”代码是指这个的话。 - Publius
另外,顺便提一下,我认为您打算在着色器中交换矩阵乘法的顺序。 - geometrian
显示剩余2条评论
2个回答

11

我已经解决了它,但是因为解决方案太尴尬而不愿意告诉你们...

我...

我忘记绑定着色器程序。

非常抱歉浪费了大家的时间。


2
哈哈哈,原来这也是我的问题!感谢您回来并添加这个。 - Kazetsukai

4

您正在传递错误的数量16

来自文档

count参数表示要传递的矩阵数量。如果要修改单个矩阵的值,则应使用1作为count,如果要修改矩阵数组,则可以使用大于1的count

您正在得到预期的错误,根据以下内容:

如果count大于1且指定的统一变量不是数组变量,则会生成GL_INVALID_OPERATION

文档的注释部分再次告诉您:

如果count大于1且指定的统一变量不是数组,则会生成GL_INVALID_OPERATION错误,并且指定的统一变量将保持不变。


我进行了更改,但不幸的是这并没有消除错误。而且我很困惑,因为我以为问题在于元素的数量:|但由于您的帮助,我现在认识到问题出在glUniformMatrix4fv函数上! - Publius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接