A large number of game studios use assets from various libraries as placeholder content, as a foundation for polishing, and in some cases as regular content for development. But what happens when the team starts thinking about a systematic approach to performance and flexibility? Of course, a pipeline appears, followed by the realization that content from different sources is completely inconsistent, and all textures need to be converted to a project-optimized workflow. It’s hard to believe that any experienced specialist hasn’t faced this problem before. In this article, I want to share how I accelerated the process of transitioning to a unified pipeline.
Texture Converter
This tool was created to simplify and speed up the task of unifying texture assets in the project. It generates new textures by combining channels from multiple source textures. The process takes place directly in the editor, without export/import and without relying on third-party applications.
The most common task for this tool is packing textures using the "ARM" standard, which includes BC, N, and ARM into two textures: BCAO and NRM. This saves one-third of the texture memory pool.
Group | Description |
A | These are texture slots for the source textures. The ARM, Custom1, and Custom2 slots use linear color samplers. BC uses an sRGB color sampler. N is a normal map. |
B | These are the paths and file names. In the "Output Path" field, you can simply copy the path to the desired folder from the Content Browser; its format has been supported by the tool since version 1.3. In the "File Name BCAO&NRM" field, the tool will automatically add prefixes and suffixes (e.g., T_YourName_BCAO, T_YourName_NRM). The "File Name Custom" field does not do this, as it is intended for a wider range of tasks. |
C | For the algorithm to work correctly, the BC and ARM slots in Group A must be filled to generate BCAO. To generate NRM, the N and ARM slots must be filled accordingly. |
D | Here, the algorithm will take the RGB channels from the BC slot and the alpha channel from the Custom1 slot, using the channel specified in the selector. |
E | Here you can generate almost any configuration. The selector is divided into two parts: in the first part, you choose the texture slot, and in the second part, the channel. If no selection is made in the selector, the corresponding channel will receive zero values. |
F | Reducing texture dimensions plays a critical role in the streaming algorithm. Non-square textures are not supported in this project. Here you can generate a square texture based on any input size. The algorithm works with the BC slot for sRGB and Custom1 for linear color. The generated texture will be saved to the folder specified in the Output Path, and the file name will be taken from the source file. |
G | In this group, you specify the texture size you intend to generate. A resolution of 2048x2048 is not justified for all textures. Many objects will maintain an acceptable texel size even if you reduce the texture to 1024x1024. |
I fully understand this tool for a specific task. But writing something similar for another configuration takes hours. The time savings for environment artists are measured in weeks.
I’m glad I managed to speed up the team. Off the record, I’ll say that after this version the converter’s functionality has grown significantly.