0

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

经过一番挖掘,我发现(使用 println 进行跟踪调试)所有对 glGetUniformLocation 的调用(从第 248 行开始)都返回负数。鉴于这是一个托管在 LWJGL 网站上的相当专业的教程,而且我在未修改的情况下复制了它(除了我更改的一些硬编码文件路径),我觉得它可能与我的 openGL 版本、我的显卡有关,或类似的神秘事物。

在查看glGetUniformLocation 的详细信息后,我发现如果您要求的 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);

我错过了什么?

4

1 回答 1

0

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

要获得活动制服的数量:

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

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

这也包含在:如何在 OpenGL es 2.0 vertex shader pro 中找到所有制服的列表

于 2013-07-11T01:44:09.890 回答