统一变量报告未找到 LWJGL 3

Uniform variable reported not found LWJGL 3

简介

我正在 Java 中使用 Gradle 中的 LWJGL 3 依赖项创建 2D OpenGL 游戏。

目前我已经实现了一个 class VertexArray,它处理模型数据(verticesindicestexturecoords)——包括创建和处理 VAOsVBOs.

我为他们实现了着色器,并且可以成功地为投影和变换矩阵加载制服,例如 mat4。然后我使用 org.l33tlabs.twl PNGDecoder 添加纹理并将其全部包装在 class Texture 中,它处理绑定纹理单元、解除绑定和从 openGL 中删除纹理。绑定函数还在绑定纹理之前调用 shader.setUniform1f("textureSampler",0);

代码

entityVertex.glsl

#version 400 core

in vec4 position;
in vec2 textureCoords;

out vec2 passTextureCoords;

uniform mat4 projectionMatrix;
uniform mat4 transformationMatrix;

void main()
{
    gl_Position = projectionMatrix * transformationMatrix * position;
    passTextureCoords = textureCoords;
}

entityFragment.glsl #version 400 核心

in vec2 passTextureCoords;

out vec4 out_Color;

uniform sampler2D textureSampler;

void main()
{
    vec4 colour = texture(textureSampler,passTextureCoords);
    out_Color = colour;
}

vertexArray render

public void bind() {
    glBindVertexArray(vao);
    glEnableVertexAttribArray(VERTEX_ATTRIB);
    glEnableVertexAttribArray(TCOORD_ATTRIB);
    glBindBuffer(GL_ARRAY_BUFFER, tbo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
}

public void unbind() {
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glDisableVertexAttribArray(VERTEX_ATTRIB);
    glDisableVertexAttribArray(TCOORD_ATTRIB);
    glBindVertexArray(0);
}

public void draw() {
    glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_INT, 0);
}

public void render(Shader shader, Texture texture) {
    texture.bind(shader);
    bind();
    draw();
    texture.unbind();
    unbind();
}

texture

public void bind(Shader shader) {
    shader.setUniform1f("textureSampler", 0); //<-- Line that throws error
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);
}

public void unbind() {
    glBindTexture(GL_TEXTURE_2D, 0);
}

问题

当我运行这个时,我从着色器中的这个方法得到错误"Could not find uniform variable 'textureSampler'!"

private Map<String, Integer> locationCache = new HashMap<>();

public int getUniform(String name) {
    if (locationCache.containsKey(name))
        return locationCache.get(name);
    int result = glGetUniformLocation(ID, name);
    if (result == 1) System.err.println("Could not find uniform variable '" + name + "'!");
    else locationCache.put(name, result);
    return result;
}

public void setUniform1f(String name, float value) {
    if (!enabled) start();
    glUniform1f(getUniform(name), value);
}

Here 是主 Git 仓库的 link,如果你克隆你将需要导入和更新子模块(我在 java 中制作相同的游戏awt 和 openGL) Here 是 GL 特定子模块的 link

有什么明显的问题吗?如果您需要查看更多代码,请告诉我。

glGetUniformLocation returns -1 如果名称不是指定程序中活动统一变量的名称:

if (result == 1) System.err.println("Could not find uniform variable '" + name + "'!");

if (result == -1) System.err.println("Could not find uniform variable '" + name + "'!");