3
\$\begingroup\$

After integrating the graphics assets to my application, I noticed that when the textures are compressed they look very bad compared to truecolor. This happens to all the textures and it did not seem to help changing the texture type to GUI nor did it help to switch the 32-bit display buffering on.

Does using truecolor textures make the application much heavier to run? Or does it just increase the size of the .APK? Are there alternatives to getting a good texture quality and a smaller texture size instead of using truecolor?enter image description here

EDIT: I did some experiments with the dithering. I created a textures in GIMP 2.8, one which was RGB and one which was indexed with 255 colours and Floyd-Steinberg dithering with reduced colour bleeding. In the Windows Explorer this looked promising, the image quality had hardly been reduced but the size was halved.

DitheredTruecolor

But when they were imported to Unity, they were exactly the same size. And trying out different formats, there was not much noticeable difference between the image quality. Although the banding was a little bit less pronounced but still clearly seen.enter image description here

EDIT 2: I played around with the importing settings. And the only conclusion I can come up with is: Don't use alpha! Without the alpha channel, there is no banding with the ETC-compression which is supported by all OpenGL ES 2.0 GPUs.

To have an alpha channel and no banding. I had to go all the way to RGBA 32-bit, which increased the texture file size to 64Kb compared to the no alpha channel ETC's 8Kb.

Here again: not much difference between the GIMP dithered and the RGB versions. So conclusion with this: Dithering in GIMP did next to nothing.

No banding comparison

\$\endgroup\$
4
  • \$\begingroup\$ How are you doing this compression? From your images it looks as though you're just decreasing to 256-colour (and your mention of truecolour supports this guess), which is not proper texture compression, but can you confirm? Using proper texture compression (S3TC/DXT) will improve perf due to lower bandwidth requirements. \$\endgroup\$ Commented Nov 21, 2012 at 13:56
  • 1
    \$\begingroup\$ Dithering helps a lot when reducing the bit count of images. If Unity doesn't support dithering, try doing that in Photoshop or in some alternative. \$\endgroup\$
    – msell
    Commented Nov 22, 2012 at 7:51
  • \$\begingroup\$ @mh01 The compression is done on Unity's own texture importer. \$\endgroup\$
    – Esa
    Commented Nov 23, 2012 at 6:17
  • \$\begingroup\$ I'm not sure your research of the different formats belongs to the question? It looks like this should be part of an answer? And just FYI: The main reason for texture compression is the savings in texture memory. Reducing file size is a nice side effect, but not the deciding factor. \$\endgroup\$
    – bummzack
    Commented Nov 23, 2012 at 8:36

2 Answers 2

1
\$\begingroup\$

Compression setting for a texture is different from Texture Type. See here

Unity screenshot

This screen is from windows project, Android would probably have slightly different settings, but it should have at least one uncompressed option.

Note that uncompressed textures need WAY more memory during runtime (and more space in APK too).

\$\endgroup\$
1
  • \$\begingroup\$ I played around with the texture importer settings. Results can be seen in the edits. \$\endgroup\$
    – Esa
    Commented Nov 23, 2012 at 6:51
1
\$\begingroup\$

First off: As with any optimization, first check if this is a problem, only then try to solve it.

Does using truecolor textures make the application much heavier to run?

When compared to compressed textures, truecolor textures mainly take more RAM. The compressed data also takes less bandwidth to transfer around and may also help with cache hits (depending on where the cache is located in the pipeline).

I haven't benchmarked it, nor can't I find any easily accessible benchmark, but I'd guess that unless you're using huge textures, you probably won't see much of a difference in performance, especially if you're using mipmaps properly.

Or does it just increase the size of the .APK?

Not sure how unity handles these things, but "truecolor" textures may be shipped as jpg images, for instance, in which case they will probably take less space (1:10 or better) in an apk than ETC compressed files (1:4 or 1:6) would.

Are there alternatives to getting a good texture quality and a smaller texture size instead of using truecolor?

Sure, but that depends on how much effort you're willing to put into it. There's always a cost..

Procedurally generated textures fully in the shader, building a big texture from tiles within a shader, or using detail textures to mask the low resolution of the main texture are some techniques that come to mind.

If you can get away with it, just store your texture as grayscale and tint it in a shader. Next, you can combine several textures into a single texture's R, G and B channels, and separate them in a shader to grayscale and tint it.

A word of warning regarding paleted textures: they're hardly supported by any hardware these days and may end up being "plain" truecolor textures in the end (eating memory etc). Simulating a paleted texture using shaders is one interesting option though, but I wouldn't go there unless I needed to do palette-cycling effects or some such.

\$\endgroup\$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .