But remember: uniform blocks are defined by the block name, not the instance name. You cannot have two blocks with the same block name, as they would be the same block.
However, what makes a lot more sense is to create an array of blocks:
This will create two distinct blocks, named (in OpenGL) TexParams[0] and TexParams[1]. These blocks will consume bindings 1 and 2, and you can access them in GLSL through TexUBO[0] and TexUBO[1].
But arrayed blocks cannot be given arbitrary bindings from within GLSL. An array of blocks will consume a contiguous sequence of bindings starting at the given binding index, unless you change the bindings from OpenGL.
That works, but has (for me) the slightly undesirable property of adding a nested scope for the purposes of accessing UBO state in the shader (e.g. Tex1UBO.data._a[0]).
However, cross-refing with the GLSL spec, that’s remedied by using this somewhat awkward syntax, allowing: Tex1UBO._a[0]).