# Virtual Reality in Cultural Heritage: A Setup for Balzi
## 3 Materials and Methods
### Second Iteration of the Balzi Rossi VR Experience
This led to increased creative liberty in level design, providing a higher computational budget for incorporating distinctive landscape elements. A primary limitation of the first version of the Balzi Rossi VR experience was landscape constraints: nearly all hardware resources were consumed for cliff rendering, leaving a scant budget for level design. This resulted in a complete absence of the coastal strip, including museum buildings, plants, rocks, and other natural features. For level construction, free assets from Quixel Megascans and the Epic Games Marketplace were utilized. For the coastal part, the game map was modeled using Unreal's landscape space to achieve shapes, colors, and hues akin to reality. In the landscape material, a function to blend two different textures was used to minimize tiling as much as possible. Regarding the construction of two staircases, a walkway crossing the railway, and a small stone utility shed (Figure 5), the meshes and their materials were modified, also utilizing modeling tools available in Unreal. Additionally, for a more visually seamless integration of the meshes into the landscape, Vertex Paint and Runtime Virtual Texturing tools were employed. Streaming Virtual Texturing (SVT), an alternative method in Unreal Engine 5 for texture streaming from the disk, offers several advantages and some disadvantages compared to the traditional MIPmaps-based method [16]. This latter method conducts an offline analysis of UV material usage and decides which MIP levels of a texture to load based on visibility and object distance from the observer during runtime. This can be limiting as the streaming data considered are the MIP levels of the native resolution textures. High-resolution texture use can significantly impact performance and memory overload when loading a higher MIP level. Additionally, the CPU makes decisions on MIP texture streaming using object visibility and culling settings. Here, visibility is more conservative, meaning the system is more likely to load an object to avoid sudden appearances (popping) as the player moves. Therefore, even if only a small part of the object is visible, the entire object is considered visible; the loaded object includes any associated textures that might be needed for streaming. In contrast, the SVT system transmits only texture parts that are actually visible to the user. This is achieved by dividing all MIP levels into small, fixed-size sections (tiles) where the GPU determines their visibility from the observer's perspective; consequently, when Unreal considers an object visible, the GPU is instructed to load the required tiles into a GPU memory cache. Regardless of texture size, the fixed tile size considers only those actually visible; the GPU calculates their visibility using the \(Z\)-buffer, ensuring that texture streaming occurs only for visible parts relevant to certain pixels on the screen. Runtime Virtual Textures (RVT), which was used in the Balzi Rossi level to better integrate meshes with the landscape, operates similarly to SVT but differs in some specifics [17]: here, the texture texels are generated in real time by the GPU, not pre-calculated and stored on disk as in SVT. RVT is designed for textures that need to be generated on demand, like procedural textures or landscape materials with multiple layers. For the insertion of plants and rocks (Figure 5), Unreal's foliage space was used, ensuring better asset management; notably, all meshes placed in the level are considered as a single instance, weighing less in terms of rendering compared to positioning each mesh individually from the content browser. To achieve a minimum of 60 frames per second (FPS), extensive work on LOD optimization and mesh simplification was necessary. Instead of using four or five LOD levels, only two were employed: a level 0 with a mesh not exceeding 2500/3000 triangles and a level 1 with a 2D billboard image always oriented towards the observer's camera.