Hi, everyone, I am now studying the use of UniformBuffer. I know that ubo can update values for multiple pipelines at the same time. What I am designing now is that all uniforms in each pipeline should be designed as one ubo, but this requires every Dynamically update the binding-point of ubo every frame, because I can’t see if the ubo-binding-points in different pipelines conflict, I don’t know if this is the right way to use it, or there is a better way to use it?
The complete code is here:
- [url=https://github.com/xlonlat/xOpenGL.git]https://github.com/xlonlat/xOpenGL.git[/url]
// init
xUniformBuffer::xUniformBuffer(uint32_t size, uint32_t binding)
: m_ContextID(0), m_Binding(binding), m_Size(size)
{
glGenBuffers(1, &m_ContextID);
glBindBuffer(GL_UNIFORM_BUFFER, m_ContextID);
glBufferData(GL_UNIFORM_BUFFER, m_Size, NULL, GL_DYNAMIC_DRAW);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
}
// pre update
void xUniformBuffer::UpdateData(const char* data) const
{
glBindBuffer(GL_UNIFORM_BUFFER, m_ContextID);
glBufferSubData(GL_UNIFORM_BUFFER, 0, m_Size, data);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
}
// update
void xRenderer::BindDescriptorSetLayout(const xDescriptorSetLayout& desc_layout) const
{
for (const xDescriptorHandle* desc : desc_layout.Datas())
{
if (desc->Type() == xDescriptorType::Uniform)
{
glBindBufferBase(GL_UNIFORM_BUFFER, desc->Binding(), desc->ContextID());
}
else if (desc->Type() == xDescriptorType::Texture)
{
glActiveTexture(GL_TEXTURE0 + desc->Binding());
glBindTexture(GL_TEXTURE_2D, desc->ContextID());
}
else if (desc->Type() == xDescriptorType::TextureCube)
{
glActiveTexture(GL_TEXTURE0 + desc->Binding());
glBindTexture(GL_TEXTURE_CUBE_MAP, desc->ContextID());
}
}
}