Repository navigation
02 ‐ Final Fantasy VII Remake Guide

This image compares methods of baking lighting texture maps for Tifa's Hair mesh in FFVII Remake.
I compare two approaches: a more detailed method using Normal Smithing and the “fake” bent normal technique using Blender (by Wolfenstein on the OpenFFVIIR Discord).
Normal Smithing uses ray-casting to generate bent normals by capturing how light interacts with the hair by averaging unobstructed light directions, leading to realistic self-occlusion and dynamic shading that shows fine details and natural shadows which can be seen in the video.
In contrast, using the Blender (Fake Bent Normal) approach simply assigns a uniform light direction per face, resulting in flatter shading without the nuanced shadowing that comes from nearby occluding geometry. This can be seen in several scenes where the hair in the Blender approach shows a flat black vs the better shading of the base game and Normal Smithing.
The rest of this page documents the settings I've used to generate Bent Normal and Occlusion maps for Final Fantasy VII Remake.
The settings below are for a final detailed render that takes roughly 10 minutes on a Ryzen 7950x3D.
- Texture Width: 2048
- Texture Height: 2048
- UV Padding: 0
- Supersample Factor: 2x
- Bent Normal/Occlusion Map: UV 1
- Alpha Map UV: UV 0
- Generate Bent Normal Map: Yes
- Generate Occlusion Map: Yes
- Use Tangent Space: Yes
- Use Cosine Distribution: Yes
- Process Back-facing Triangles: No
- Lerp Occlusion From Threshold: Yes
- Invert X: No
- Invert Y: Yes
- Invert Z: No
- Ray Sample Count: 64
- Max Ray Distance: 1000
- Ray Origin Bias: 0
- AA Sub-Samples: 2x
- Occlusion Threshold: 0.428
Important Note: To get both sides of the hair mesh to appear in blender, you need to duplicate the hair mesh and the go edit->Normals->Flip. I don't join these meshes together again afterwards as this would double the amount of UVs needing to be calculated. You can leave them as seperate meshes and import into FFVIIR and everything works fine as you can see in my Tifa Shorter Hair mod.
In Blender 3.6, import the model using the Blender Uasset Addon and ensure "Keep Sections" is ticked and "Scale" is set to Centimetres.
It is important to use "Keep Sections" as this will allow us to choose a mesh within Normal Smithing's settings.
If you've extracted all of the Uassets, including textures, you can check "Load Textures".
This will help you later if you have an Alpha Texture you want to use.
Go to File -> Export -> FBX.
- Under "Geometry", ensure that "Tangent Space" is NOT ticked.
- Under "Armature", uncheck "Add Leaf Bones".
- Uncheck "Bake Animation".
If the mesh you are trying to calculate Bent Normals or Occlusion maps for has an Alpha Texture, be sure to export this from Blender or extract it from the source Uasset.
You can use UE4-DDS-Tools to extract the alpha texture from the Uasset manually.
Or if you imported the textures into Blender:
- Go to "Texture Paint" on the top tabs.
- On the left-hand side at the top, click on the Image Dropdown.
- Select the correct alpha texture.
- Next to the Image Dropdown in the "Image" dropdown menu, click on that, then save the image as a PNG.
Use the "Load Model" button to import the exported model from Blender.
Displays a dropdown list of all meshes available in the loaded model.
Selects the mesh that will be used for map baking.
If the mesh requires an Alpha Image, open the file dialog and select the alpha texture image we exported earlier.
The alpha texture, if provided, is used during occlusion testing to simulate transparency.
Important Note: When preparing your alpha texture for occlusion testing, ensure that it is formatted correctly. The application supports two approaches:
- RGBA Format: The texture should include an explicit alpha channel where transparency is determined by the alpha values.
- RGB Format (using Greyscale): If the texture lacks a dedicated alpha channel, use a greyscale image where the luminance (from Black to White) represents transparency—darker areas will be treated as more transparent, while lighter areas will be considered opaque. This distinction is crucial because the alpha texture is sampled during the baking process to determine occlusion. An improperly formatted texture may lead to inaccurate occlusion results. The application uses different methods to read the pixel data depending on the file type (for example, PNG images retain their original format using a WPF decoder), so ensuring your texture meets one of these standards will help avoid unexpected behavior during the bake.
FFVII Remake uses the RGB Greyscale format for its Alpha textures.
The standard for the game is 1024x1024. For meshes with small UV islands (or if you are encountering black triangles on the mesh in game) try a higher resolution, as there will be more Bent Normal/Occlusion pixels per UV island. For my Tifa Shorter Hair mod i used 2048x2048 for the Bent Normal and Occlusion Map textures.
I used 0 and relied on the average normal background color to refine the edges.
I used 2x at a texture resolution of 2048x2048, so internally it will be calculating at 4096x4096 before downscaling at the end. This is to drastically reduce the image noise seen at lower resolution. Increasing this will always produce a higher quality results at the expense and time and processing power.
The standard "Bent Normal/Occlusion Map" UV for FFVIIR is UV 1.
The standard "Alpha Map" UV for FFVIIR is UV 0.
Check one or both depending on what you want to generate.
-
On:
Transforms computed bent normals from world space into the surface’s local tangent space.- This is what the game is expecting for the Bent Normal Map.
-
On:
Generates sample directions using a cosine-weighted distribution.- This is what the game is expecting for the Bent Normal Map.
-
Off:
Usually unnecessary for the current game assets, may be necessary for custom meshes. You can check in blender if your mesh as back-facing triangles (flipped normals) by using the Face Orientation option under the show overlays button at the top right corner of the viewport.
-
On:
For hair in particular, if you want higher contrast in the occluded areas but still smooth the transitions between light and dark, leave this on. -
Off:
From my testing, this is the closest to the default look in the game.
- The game expects Y to be inverted, so Y should be ticked.
These can be set to whatever you like.
I start at 64; you can go higher for a higher quality output but that might be unnecessary for this use.
In the comparison video I used 64.
I've left this at 1000, given the size of the mesh it probably doesn't need to be that big.
Set this to 0 so that the app automatically calculate this from the geometry.
Setting this to 2 means that for each pixel, 2 sub–samples are computed and then averaged, leading to a smoother transition across edges. Increasing the AA sub-sample count can significantly improve image quality by reducing noise and aliasing, though it will also increase processing time.
By default, the Occlusion Maps from the game appear to have a hard limit at 0.428.
On my PC (Ryzen 7950x3D, 64Gb RAM) this took around 10 minutes to bake out giving really high quality detailed maps ready to use in game. When testing your mods i would recommend reducing the settings to do more rapid iterations before using this high settings for the final render.