Skip to content

I sell 4K textures. Most of you should not use 4K.

A 4K PBR set costs 64 MB and covers four metres of surface. Here is the resolution your prop actually needs, and the arithmetic that decides it.

TexturesOptimisationWorkflowSeptember 8, 20266 min read
article · i-sell-4k-textures-most-of-you
shaded · wire
I sell 4K textures. Most of you should not use 4K.

Every smart material I sell ships a 4096 by 4096 PBR set. That is on the aisle page, it is what the file you download contains, and it is deliberate. It is also, for most of the objects you are going to put it on, about four times more texture than the shot needs.

I ship 4K because I do not know your scene. You do. So here is the arithmetic I run before I use one of my own sets at the size it arrived in, and the settings that let you fix it without re-exporting anything.

Texture resolution is a distance, not a quality setting

Resolution on its own means nothing. What matters is texels per metre of surface — how many pixels land on a real-world metre of the thing you are looking at.

Take an ordinary wooden crate, 60 cm on a side. Six faces, 0.36 square metres each, 2.16 square metres of surface in total. Pack that into one 4096 map and you get roughly 2,800 texels per metre.

StraySpark Studio's texture resolution guide puts the sensible bands at 256 to 512 texels per metre for mobile and VR, 512 to 1,024 for third person at 60 FPS, 1,024 to 2,048 for first person, and 2,048 to 4,096 for cinematic work. So a 60 cm crate at 4K is sitting in the cinematic band. In a third-person game it is roughly three times the density of the wall it is standing against.

That mismatch is visible, and not in the way people expect. The crate does not look better. It looks like it came from a different game. The eye reads inconsistent texel density as a continuity error long before it reads it as detail.

The fix is not a slider. It is the UV layout — how much of the 0 to 1 space each shell gets, and whether you are laying out to a fixed density or just filling the square.

What the extra pixels cost

Same guide, and the numbers match what a BC7-compressed texture with a full mip chain actually weighs: about 0.33 MB at 512, 1.33 MB at 1K, 5.33 MB at 2K and 21.33 MB at 4K. A three-map set — base colour, normal and a packed ORM — comes to roughly 4 MB at 1K, 16 MB at 2K and 64 MB at 4K.

Sixty-four megabytes. For one crate.

Drop that crate to 2K and it costs 16 MB and still sits at 1,400 texels per metre, which is comfortably inside the first-person band. You saved 48 MB and lost nothing a player will ever see. Do it across twenty set-dressing props and you have handed back roughly a gigabyte of streaming pool.

There is a second number worth knowing. If your crate never occupies more than about 500 pixels of a 1080p frame, the GPU is already sampling mip 3: 4096 halves to 2048, halves to 1024, halves to 512. You shipped four mip levels that will never be read at that distance. They are not free. They are resident.

Blender users are paying about three times that

Everything above assumes GPU block compression. Cycles does not use it. Image textures sit in memory at width times height times channels times bits per channel, which for a 4096 by 4096 RGBA8 map is around 67 MB rather than 21. Three maps is roughly 200 MB for one material.

This is why an archviz scene built out of bought texture libraries hits swap on a machine that renders a character fine. It is not the geometry. It is forty gigabytes of maps that nobody downsized, because downsizing felt like giving something up.

The settings that fix it without re-exporting

You do not have to go back to Painter for any of this.

In Unreal, open the texture asset and set Maximum Texture Size. It genuinely reduces the resource size of the asset and the memory it consumes. Do not use LOD Bias for this — Epic's own developer forums carry a report that LOD Bias applied to a texture in the content browser does not reduce project memory, because it caps the resolution the texture is displayed at rather than what is loaded. Two settings that look interchangeable in the properties panel, and only one of them does the thing you wanted.

In Blender, Render Properties, Simplify. There are two Texture Limit dropdowns, not one, and this is where people lose an afternoon. Viewport Texture Limit and Render Texture Limit are separate settings with the same eight values — off, 128, 256, 512, 1024, 2048, 4096, 8192. Set the viewport one and your viewport gets lighter while your render is unchanged. Set both to 2048 and every oversized map in the scene is downsized on load. Cycles only. Render a test frame at both settings and look at them side by side before you decide 4K was load-bearing. In most interiors it is not.

In Substance Painter, the document resolution and the export resolution are two different settings, and treating them as one is the most expensive mistake I see. Generators, filters, anchor points and procedural masks re-render at whatever the document is set to. Hand-painted strokes and imported bitmaps resample. So author at 2K, where every brush stroke is four times cheaper and the viewport stays responsive, raise the document at the end if the asset earns it, and export at whatever each engine actually needs. Change the size on one layer and watch what happens before you trust me on it.

Where 4K earns it

Tileables. A tileable is not one object's budget, it is the surface of an entire building. A 4K tileable at a 2 m repeat gives you 2,048 texels per metre across every wall it touches, and that is the one case where the big map is the cheap option rather than the expensive one.

After that: character faces, first-person hands and weapons, and anything the camera parks in front of in a detail screen. StraySpark's guide lands in the same place, and so does every environment lead I have worked with. Hero assets get the pixels. The crate behind the hero asset does not.

Where dropping resolution costs you something

Halving a base colour map is nearly free. Halving a normal map is not the same operation.

Averaging four normals produces a shorter vector, and a shorter vector reads as a flatter surface. The detail does not blur, it disappears, and the specular response changes with it. That sub-texel detail you just destroyed is exactly what roughness is a measurement of, which is why Unreal has Composite Texture and Composite Texture Mode on the roughness asset: it pushes the normal map's variation into the roughness mips so the surface keeps its shimmer instead of going glassy in the distance. It only works if the normal and the roughness share a UV layout, and the normal needs at least as many mips as the roughness. Set it once per material and stop thinking about it.

So the honest version of my position is not "use 2K". It is: pick the number from the surface area and the camera, not from the folder you downloaded. Then check the normal map afterwards, because that is the one that lies to you on the way down.

I will keep shipping at 4096. Downsampling my set costs you a minute and loses almost nothing. Upsampling a 2K set invents detail that was never authored, and there is no setting anywhere that fixes that.

Written by

Milad Kambari

3D artist and instructor, founder of 3DRedBox Studio KFT. Twenty years of texturing, material authoring and teaching — currently a top ArtStation Marketplace seller.

Read the full story →