LWJGL - 统一缓冲对象不起作用

时间:2017-05-21 08:18:07

标签: java opengl glsl shader lwjgl

我试图在我的游戏中实现统一的缓冲区对象,但由于某种原因我还没有使用它。我不认为它目前向着色器发送任何内容。在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);

1 个答案:

答案 0 :(得分:0)

在实现大量的糖代码之前,请确保让它工作,然后逐步转换到util类等等。

所以,摆脱UBO类和init:

  • glGenBuffersglBufferDataglBindBufferBase(稍后-range,它涉及一些额外的偏移内容)

  • 然后设置着色器,确保> = 0并且glGetUniformBlockIndex!= -1然后glUniformBlockBinding

  • 也摆脱:

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

现在,在渲染中:

  • 最好避免使用缓冲区并处理位置设置/重置或翻转/倒带以减少错误暴露。然后执行for并将viewMatrix保存在缓冲区中。

  • 绑定您的缓冲区glBufferSubData并取消绑定