Java LWJGL—统一缓冲区对象不';行不通

Java LWJGL—统一缓冲区对象不';行不通,java,opengl,glsl,shader,lwjgl,Java,Opengl,Glsl,Shader,Lwjgl,我试图在我的游戏中实现统一缓冲区对象,但由于某些原因,我没有让它工作。我认为它目前不会向着色器发送任何内容。在UBO之前,一切都很顺利。这是一个完全临时的系统。我只是想让它工作 我的UBO课程: private int ubo; public void createUBO() { ubo = GL15.glGenBuffers(); } public void allocate(int bytes) { bindBuffer(); GL15.glBufferD

我试图在我的游戏中实现统一缓冲区对象,但由于某些原因,我没有让它工作。我认为它目前不会向着色器发送任何内容。在UBO之前,一切都很顺利。这是一个完全临时的系统。我只是想让它工作

我的UBO课程:

private int ubo;

public void createUBO() {

    ubo = GL15.glGenBuffers();

}

public void allocate(int bytes) {

    bindBuffer();

    GL15.glBufferData(GL31.GL_UNIFORM_BUFFER, bytes, GL15.GL_STATIC_DRAW);

    unbindBuffer();

}

public void updateUBO(FloatBuffer buffer) {

    buffer.flip();

    bindBuffer();

    GL15.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 0, buffer);

    unbindBuffer();

}
我的游戏循环:

public void init() {

    ubo = new UBO();

    ubo.createUBO();
    ubo.allocate(64);

}

public void render() {

    basicEntityShader.start();
    basicEntityShader.loadFog(fogColor, fogDensity, fogGradient);
    basicEntityShader.loadLights(lights);

    Matrix4f viewMatrix = Maths.createViewMatrix(camera);
    FloatBuffer buffer = BufferUtils.createFloatBuffer(16);
    viewMatrix.storeTranspose(buffer);

    ubo.updateUBO(buffer);

    basicEntityShader.setUBO(ubo);
    basicEntityShader.bindUniformBlocks();
    entityRenderer.render(entities, camera);

}
着色器:

layout (std140) uniform Matrices  {

    mat4 viewMatrix;

};
绑定:

GL30.glBindBufferRange(GL31.GL_UNIFORM_BUFFER, 0, ubo.getUbo(), 0, 64);

int block = GL31.glGetUniformBlockIndex(programID, "Matrices");

GL31.glUniformBlockBinding(programID, block, 0);

在实现大量sugar代码之前,请确保它正常工作,然后逐步转换为util类等等

因此,去掉UBO类并在init中:

  • glGenBuffers
    glBufferData
    glBindBufferBase
    (稍后
    -范围
    ,它涉及一些额外的偏移量)

  • 然后设置着色器,确保大于等于0且
    glGetUniformBlockIndex
    !=-1然后
    glUniformBlockBinding

  • 还要摆脱:

    basicEntityShader.setUBO(ubo);
    basicEntityShader.bindUniformBlocks();
    
  • 在init中分配一个floatbuffer,不要每次在渲染循环中都这样做

现在,在渲染中:

  • 最好避免消耗缓冲区,处理位置设置/重置或翻转/倒带,以减少错误暴露。然后对执行
    ,并将
    视图矩阵
    保存在缓冲区内

  • 绑定缓冲区,
    glBufferSubData
    并解除绑定


我刚刚用你给我的这些技巧重写了ubo代码,现在它开始工作了。谢谢