HD Texture Support

Hello! The Citra emulator gets better and better with every update (it runs nearly all of my favorite 3DS titles very well!), and with Netplay it’s been a blast! However, when playing Citra on my 27" 4K monitor or on my TV, the low texture resolution in games is very apparent. Even the HD texture forwarding can’t increase texture quality, which is why I’m wondering if we’ll see support for custom textures anytime soon? It would be very much appreciated.

Thanks in advance!


The 3DS game textures are actually made according to the 3DS screen resolution. So they are obviously in low resolution. The team may have to use some hacks to remove the texture resolution limit.

No hacks in citra :wink:

1 Like

Aside from basic upscaling (set resolution to 4x, 6x, etc in graphics) we ca’t make the textures ‘better’.

Texture enhancements would have to be implemented by ROM hacks.

ROM hacks would not work too nicely as the 3DS RAM is still limited or the game might use algorithms which only work on specific resolutions or buffer sizes.

Instead, someone would have to patch this into Citra. Whenever a texture is moved from the game into the texture cache, it’s hash (so a unique value describing the texture) would have to be looked up in a high-res texture folder, if a replacement texture (which can be any size) exists, that would be loaded into the texture cache of Citra. Citra would then automatically handle keeping an upscaled version until it’s not possible to do so.
Implementing a feature like this would be very easy, but we should probably wait until the new texture cache is implemented. Also, due to the hacky nature of this feature, I’d suggest to keep it in a fork, rather than putting it in the official Citra releases.

(Also good luck finding anyone willing to work on it, although @Selby once worked on a similar feature)

1 Like

Texture filtering would do the same, right?

1 Like

Not really… as it wouldn’t directly change the old textures (which are quite low quality, filtering them would only blur out the pixels)

Also, due to the hacky nature of this feature, I’d suggest to keep it in a fork, rather than putting it in the official Citra releases.

Dolphin’s official branch supports custom textures.

1 Like

Yes, and I also dislike that decision. I’m not saying that my opinion should reflect what other Citra (or other project) maintainers think or do, I’m just saying: I would keep it in a branch / fork as it distracts from the overall goal of 3DS emulation. It’s just more code to maintain and more code which introduces complexities and bugs.

I like to keep my projects simple, because it’s very easy to merge different codepaths / forks together, as evidenced by unofficial Citra builds in the past, but it’s very hard to maintain one big blob of code of varying quality and a variety of goals. It’s also hard to remove features which have been vowen into the core, even if this should be required for other features.
By keeping things seperated you can split responsibilities, allow more creative freedom and focus on what’s important to you - also everybody involved is forced to follow a strict interface which will mature over time, rather than changing with each new feature.


A picture is worth a thousand words…

or so they say anyway im working on said feature. This is based on the new texcache so im waiting on that to get merged before i can continue adding more stuff


phantom has also worked on this in the past, but said they didn’t like it. they’re planning on adding custom texture pack loading support after texture cache rework + gl vertex/geo shaders gets merged. the biggest issue phantom had was upscaling with xBRz (for instance) has to be done on the cpu, since the glsl version doesn’t support alpha channels, so it really slow. The second issue is the 3ds uses a compressed texture format, so they don’t look as good upscaled as one would hope. But you can keep good performance and have nice textures if you support custom textures and get community support for them. I’m not against upscaling, but it comes at a cost, and i think the more viable long term solution is to have custom texture packs. (I’m not saying custom texture packs don’t also have downsides don’t get me wrong. I just think it’ll look and play better)

While having hd texture packs is ultimately the goal i still think having an upscale option is good. Not every game has a large fanbase willing to re-texture everything and having a momentary lag spike should be a nice performance trade-off. That said xBRz isnt the best algorithm im experimenting on adding a deposterize filter and trying durante’s ppsspp hybrid scaling


Sounds awesome. I’m excited to see where this goes :slight_smile: