glGetUniform意外地返回负值

时间:2013-07-10 21:46:52

标签: opengl lwjgl

我使用的代码here基本上没有修改。本网站上的所有其他教程都适用于我。然而,当我尝试运行时,我最终只得到一个矢车菊屏幕。

经过一番挖掘,我发现(使用println的跟踪调试)所有对glGetUniformLocation的调用(从第248行开始)都返回负数。鉴于这是一个在LWJGL网站上托管的合理专业教程,并且我没有修改它(除了我改变的一些硬编码文件路径),我觉得它可能与我的openGL版本,我的显卡有关,或类似的奥术。

在glGetUniformLocation上查找specifics后,我发现如果你要求一个不存在的Uniform或者错误的类型,它可以返回负数。为了表明这不是我的问题,我将在这里重现GLSL代码和glGetUniformLocation的调用:

#version 150 core

uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;

in vec4 in_Position;
in vec4 in_Color;
in vec2 in_TextureCoord;

out vec4 pass_Color;
out vec2 pass_TextureCoord;

void main(void) {
    gl_Position = in_Position;
    // Override gl_Position with our new calculated position
        gl_Position = projectionMatrix * viewMatrix * modelMatrix * in_Position;

    pass_Color = in_Color;
    pass_TextureCoord = in_TextureCoord;
}

和调用:

projectionMatrixLocation = GL20.glGetUniformLocation(pId, "projectionMatrix");
viewMatrixLocation = GL20.glGetUniformLocation(pId, "viewMatrix");
modelMatrixLocation = GL20.glGetUniformLocation(pId, "modelMatrix");
System.out.println(pId+", "+projectionMatrixLocation+", "+
    viewMatrixLocation+", "+modelMatrixLocation);

我错过了什么?

1 个答案:

答案 0 :(得分:0)

考虑查询着色器以获取所有统一数据,以便您可以轻松查看哪些制服处于活动状态。这是唯一可靠的方式来确定。我这样做是为了在我的着色器类中构建内部地图的属性和制服,用于验证与着色器的所有交互(可以禁用)。

获得活动制服的数量:

GLint uniforms;
glGetProgramiv(programRef, GL_ACTIVE_UNIFORMS, &uniforms);

对于每个制服,请通过调用glGetActiveUniform获取名称和数据类型。

这也包含在:How can I find a list of all the uniforms in OpenGL es 2.0 vertex shader pro