LWJGL - 统一缓冲对象不起作用
LWJGL - Uniform buffer object doesn't work
我试图在我的游戏中实现统一缓冲对象,但由于某些原因我没有让它工作。我认为它目前没有向着色器发送任何内容。在 UBO 之前一切正常。这是完全临时的系统。我只是想让它工作。
我的最终受益人class:
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);
在实施大量糖代码之前,请确保它能正常工作,然后逐步转向 util classes 等等。
所以,摆脱 UBO class 并在 init:
glGenBuffers
、glBufferData
、glBindBufferBase
(后来-range
,它涉及一些额外的偏移量)
然后设置你的shader,确保是>= 0 and glGetUniformBlockIndex
!= -1 然后是glUniformBlockBinding
同时删除:
basicEntityShader.setUBO(ubo);
basicEntityShader.bindUniformBlocks();
在init中分配一个floatbuffer,不要每次都在render loop中分配。
现在,在渲染中:
最好避免消耗缓冲区并处理位置 set/reset 或 flip/rewind 以减少错误暴露。然后执行 for
并将 viewMatrix
保存在缓冲区中。
绑定你的缓冲区,glBufferSubData
并解除绑定
我试图在我的游戏中实现统一缓冲对象,但由于某些原因我没有让它工作。我认为它目前没有向着色器发送任何内容。在 UBO 之前一切正常。这是完全临时的系统。我只是想让它工作。
我的最终受益人class:
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);
在实施大量糖代码之前,请确保它能正常工作,然后逐步转向 util classes 等等。
所以,摆脱 UBO class 并在 init:
glGenBuffers
、glBufferData
、glBindBufferBase
(后来-range
,它涉及一些额外的偏移量)然后设置你的shader,确保是>= 0 and
glGetUniformBlockIndex
!= -1 然后是glUniformBlockBinding
同时删除:
basicEntityShader.setUBO(ubo); basicEntityShader.bindUniformBlocks();
在init中分配一个floatbuffer,不要每次都在render loop中分配。
现在,在渲染中:
最好避免消耗缓冲区并处理位置 set/reset 或 flip/rewind 以减少错误暴露。然后执行
for
并将viewMatrix
保存在缓冲区中。绑定你的缓冲区,
glBufferSubData
并解除绑定