How can I create a geometric pattern texture like this in blender?

How can I create a geometric pattern texture like this in blender?

I think the best way to create this pattern is by using an image texture. The procedural texture tooling blender provides is simply not equipped to create shapes like that.
Fortunately, we can stil create our shapes in blender, and render them out.
The shapes in the provided image are quite simple, and we can create them using curves.
To add a curve, use ShiftA>Curve>Bezier. Hit Tab to go into edit mode. You can now edit the curve by transforming the handles. In order to keep your shapes flat, I recommend editing in top down orthographic view (Numpad 7).
To get the rings like in the picture above, you can add a Bezier Circle (ShiftA>Curve>Circle).
We will need to give them thickness. Change to the curve properties window, and replicate the circled settings:
You can adjust the Bevel Depth to change the thickness. This will turn our curve into a 3D tube.
We will start off by setting the materials. Add an emission shader to your shape, with the strength set to 1. You can set the emission color to set the color of your shapes. I chose #E79F69. An emission shader with the strength set to one will have a uniform color no matter what lighting or camera position is used.
The reference has a black background. We can recreate this by setting the world color to black:
Now we need to setup a camera to render this. Since are shapes are supposed to appear 2D, but are infact tubes, we will have to get rid of the perspective. Otherwise the shapes further from the center will have funny shaped ends, rather than the flat lines we desire.
Left: With Perspective, Right: Without.
To fix this, we can use an orthographic camera. To set a camera as orthographic, go into the camera properties, and change it to orthographic. to "zoom" in and out, you can change the Orthographic Scale.
You will also want to position your camera so that it faces top down, and is centered. With your camera selected, go into the object properties panel. Set the X and Y values to 0, and all three rotations values to 0 (Shortcut: AltR).
Lastly, set the image to be square, this makes working with textures much easily. This can be done in the render panel, by setting the resultion. I recommend 2048 x 2048.
Now that we have setup our scene, and modeled all the shapes, its time to scatter them.
There are two ways to do this. Manual instancing, and particle instancing.
Particle instancing will automatically distribute the shapes over a plane. However, it has some drawbacks. It can take work to setup, and it will be difficult to get the shapes to pack tightly without intersections. Its also extremely difficult to get the shapes to tile.
Manual instancing Each shape is manually instanced (a fancy duplication method). The advantage is that the layout can be customized and tiled relatively easily, the downside is that for large areas it can become tedious and time consuming to setup.
For this demo, I will stick to manual instancing.
To instance a shape, select it and hit AltD. This will act like ShiftD, but with one key difference. The shapes are linked. If you edit one of the shapes, all its instances will have the edits applied. This also saves computer memory when rendering.
To spread the shapes out, select a random shape, instance it, and place it randomly. Rinse and repeat.
Now comes the really fun bit. We want to cover a large surface area in shapes, and we want the shapes to be sharp in the picture, but we don't want to have to use a massive image. We can get around this by tiling the shapes.
Tiling is when the edges of an image line up so there is no visible gap. This means the shapes on all four edges of our spread will need to be identical, and positioned identically relative to the camera.
Because we need the edges to line up, certain areas of the image will need to be identical. All four corners will need to match up (red), and the edges will need to match their opposite:
Basically, we will need to replicate a roughly square shaped patch of pattern to all the corners, and two roughly rectangular slices of pattern across the edge.
To start, we need to get the repetition interval. This is how often our pattern needs to repeat. In this case, our repeat interval is the same as the height/width of the scene. This number is the same as the orthographic scale mentioned above, which in my scene is 22.7.
For simplicity sake, I will refer to the repeat interval from here on out as ri, and half the repeat interval as ri/2.
To make lining things up simple, the patchs should not be too thick, or two thin. I recommend making them about 2.5 times the average size of a shape. Since my shapes are about two blender units across, I made my patches by 7 units wide. This means the corners will be 7x7 squares. The edge patches will now be ri - patch width in length (and path with in height).
using my numbers:
22.7 - 7 = 15.7 therefore the edge patches in the example will be 15.7x7.
In order to get our shapes to roughly line up with the edge patches, we can make some planes to use as reference. Add a plane (ShiftA>Mesh>Plane) in the properties sidebar (Toggle with N) set the x dimention to be 15.7 and the y to be 7. Duplicate the plane ShiftD and set its location to be ri/2 (11.35) on the y axis. It should now be in position like so:
We can now take our other plane (not visible in the above screenshot), and rotate it by 90 degrees (R90) and set its X location to 11.35.rx
I'll skip adding a reference plane for the corner since it is pretty easy to see where the corner is.
We will start by filling in the horizontal patch. Instance (AltD copies of your shape and spread them around inside the patch. Its okay (acutally good) if the shapes stick out a little (especially on the long edges) so there is no seam. We can tweak the patches later if they overlap.
We now have the horizontal patch. However, we will need to replicate it. Duplicating it would make tweaking hard later, since every patch needs to be fully identical. Therefore, it would be much better to instance the patch.
The bad news is that AltD won't work for us. That only replicates the mesh data, we want to copy the object transforms as well. So instead of instancing the mesh, we will instance a group of objects.
Begin by selecting all the objects in your patch. Then hit ⎈ CtrlG to group them. Hit F6 and name the group "Horizontal".
With the objects all selected, go into the object properties panel, and set the groups Y offset to half the repeat interval (11.35).
Now we can create a new instance of the group, ShiftA>Group Instance>Horizontal. Set Y transform of this new group instance to negative half of the repeat interval (-11.35).
We now have one edge done. Repeat for the other edge.
For the corner, you must add three additional instances, one at (x=ri/2,y=-ri/2), one at (x=-ri/2,y=ri/2), and one at (x=-ri/2,y=-ri/2).
The end product should look like this
There are some ugly gaps, and some of the shapes seem to have collided, or are too close. We can now select and move shapes that are parts of the original groups, to fill gaps and separate collisions. Because they are instances, all the corresponding groups will remain identical, and will therefore tile correctly.
the middle can be haphazardly filled in as described in the section on scattering the shapes.
In the end we get this:
Tiled: