2017-05-21 21 views
0

我試圖爲我的遊戲實現統一的緩衝區對象,但由於某種原因,我沒有得到它的工作。我不認爲它目前向着色器發送任何東西。在UBO之前,一切正常。這是完全臨時的系統。我只是想讓它工作。LWJGL - 統一緩衝區對象不起作用

我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(); 

} 

我gameloop:

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); 

回答

0

在實現大量的糖代碼之前,請確保它能夠正常工作,然後逐步轉換到util類等等。

所以,擺脫UBO類以及在init:

  • glGenBuffersglBufferDataglBindBufferBase(後來-range,它涉及到一些額外的偏移東西)

  • 然後設置着色器,一定是> = 0和glGetUniformBlockIndex!= -1然後glUniformBlockBinding

  • 也擺脫:

    basicEntityShader.setUBO(ubo); 
    basicEntityShader.bindUniformBlocks(); 
    
  • 在init中分配一個floatbuffer,不要每次在渲染循環中都這樣做。

現在,在渲染:

  • 更好地避免消耗你的緩衝區和處理位置設置/以減少錯誤曝光復位或翻轉/快退。然後執行for並將您的viewMatrix保存在緩衝區中。

  • 您的緩衝區綁定,glBufferSubData和取消綁定

+0

我只是改寫了這些技巧,你給我的UBO代碼,它的工作現在。謝謝! – Maineri