This is an old revision of the document!
To enhance the visual appearance, shaders, textures, and other elements are necessary. Most of the work involves applying a shader with fancy stochastic methods to blend and shuffle textures, eliminating seams between textures as they tile across the surface. Additionally, edge and vertex coloring techniques are used to create lighting and shadowing effects on the mesh. In CW4, the terrain heights are limited to integer values, and different textures are applied to the non-flat portions using the shader.
For your game, you may prefer smoother terrain. Unreal Engine (UE) likely provides shaders that can render terrain in a standard and visually appealing way. If not, UE offers excellent shader authoring support, surpassing even Unity. If I were starting from scratch in Unity today, I would follow a similar approach, but utilize the NativeArray to hold the flattened data, and utilize Unity's Burst and Jobs systems to update the mesh data efficiently when changes occur. These new engine APIs offer better performance while employing the same technique. Therefore, the same techniques should work in UE4 or UE5 (although in UE5, the introduction of Nanite may change your approach completely).
This is a general overview of the terrain representation and rendering technique. There may be additional considerations regarding surface normals and other details that you will likely address as you progress further.