Now, when I'm testing on my mac, all I need to to is pass GL_RGBA4, to the 3rd parameter (internalFormat), and I suddenly get 16 bpp textures without any problems. This works without me having to change what I pass to the last two parameters. However, when I try this on iOS, it doesn't work. Additionally I've tried passing other constants to the 3rd parameter (internalFormat) and have gotten a range of effects from totally empty textures to completely discolored neon-pinkish textures.

Unlike desktop GL, GLES doesn't convert texture data for you. If you are giving it 32 bit RGBA color data, it won't convert that to a packed pixel format for you. You have to do that yourself before uploading the texture.

The problem is that there are a bajillion different texture conversions that desktop GL needs to be able to support. Removing that from GLES makes it's implementation that much simpler.

I tried loading 2 different png rgba4444 files, one with pre-multiplied alphas and one without. Neither works. I also tried messing with a lot of the CGBitmapContextCreate parameters but have gotten nowhere so far.

@OSC: From the first post -> "I've tried PVRTC compressions (4bpp) but found the lossiness unacceptable"

If you download the PowerVR SDK they have a tool for outputing .pvr files with various pixel formats including packed ones. Pretty sure they have sample code for loading them as well. The format is pretty dead simple, I ended up just writing my own the one time since I only wanted to support one format anyway.

@OSC, it appears that you're right about CoreGraphics, I combed through some docs and they don't seem to support 16 with alpha.

@Skorche, I'd given up on pvr because of how horribly it botched my sprites. My understanding though was that 4bpp was the maximum quality (at least insofar as ogles supports).

I'm leaving my files as rgba8888 and included a routine which converts from rgba8888 to rgba4444 (or rgba5551) after it's already loaded via CoreGraphics. This seems to work well, and gives added flexibility.