The 'procedural route' might be via a shader, rather than geometry. This one depends on an 'Offset Grid' group, which divivides a 2D texture space into rectangular cells. It allows changing the relative X and Y scales, and an adjustable offset for each row:
The group returns UV coordinates per-cell, and 'Cell Idx'.. the position of (0,0) in each cell. It would typically be used for bricks, and weaves.
It can be used to divide UV space into with square cells, each row offset by half a cell:
- The whole space is noise-distorted to prevent the weave from being to regular, and produce little fuzzy threads
- A weave-bump is produced from the distance-to-cell-center, which also darkens the color in the cracks
- The effect of threads is left to 'Roughness' alone, but you could add another layer of Bump.
- The image is pixellated by using the cell-center as the lookup into it.
This is really only an example..
So far, it's looking OK close-up:
It could, I'm sure, be tweaked to your needs, should this be a way to go for you.