You can 'port' shader-style blurring to a fixed function pipeline with multitexture capabilities.
e.g. in a blur-shader, you usually sample several texels horizontally (and then vertically in a 2nd pass), sum them together and re-scale the result.
In a fixed-function renderer, you can bind the input texture to several stages of the multitexturing logic, hook up slightly different UV's to each stage, and set it to add all stages after multiplying them with a constant scale.
Once you grok the multitexturing logic of the FFP, you'll realize that a lot of "shader" effects can be implemented on it.
Thanks for the super quick reply!
I had no idea about multitexturing, I'm reading about it now, though it's sort of confusing me.

Is there a visual difference between multitexturing, and using blend functions? I'm guessing it's much faster and more efficient for texture level blending, but I'm trying to grasp the concept.
For example, say I have 2 textures, each the same size, and a sprite object wrapping each texture, each sprite pointing to the same vertices and texture coords (since same size). If I wanted to draw sprite2 at half transparency exactly on top of sprite1, I would draw sprite1 as normal, turn on alpha blending, set the alpha to 0.5, and then draw sprite2. I'd obviously be rendering the same geometry twice. So for an instance like this, multitexturing would basically allow me to achieve the same result by blending just the textures, and rendering the geometry once with one set of vertices and UV coords?
Edit:
So I started looking up texture units, and info about texture combiners, but I'm getting unexpected results. I copied the first sample from
here, and proceded to draw my sprite with usual calls. However, everything else that was previously drawn is just gone, the second texture I point to in the 2nd texture unit has no effect, and despite glPushMatrix and glLoadIdentity, the previous calls from my camera class are still translating the geometry.
The code for the multitexture is as follows
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
... other stuff that used to work ....
glPushMatrix();
glLoadIdentity();
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_2D, t1->id());
//Simply sample the texture
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); // i tried changing this to GL_COMBINE, same result
glTexCoordPointer(2, GL_FLOAT, 0, &(s1->frameBounds));
//------------------------
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_2D, t2->id());
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
//Sample RGB, multiply by previous texunit result
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); //Modulate RGB with RGB
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
//Sample ALPHA, multiply by previous texunit result
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); //Modulate ALPHA with ALPHA
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
glTexCoordPointer(2, GL_FLOAT, 0, &(s2->frameBounds));
glClientActiveTexture(GL_TEXTURE0);
glTranslatef(3.0f, 3.0f, 0.0f);
glVertexPointer(2, GL_FLOAT, 0, &(s1->vert()));
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glPopMatrix();
Edit 2I finally figured it out

,
apparently glActiveTexture is only for glBegin/glEnd calls, which aren't available in iOS, glClientActiveTexture must always be used. glActiveTexture is needs for glEnable/glDisable on iOS, glClientActiveTexture is used for vertex pointers, etc like other glClient functions. I needed to call both glActiveTexture and glClientActiveTexture together, the reason changing it
seemed to fix it was that before I wasn't setting GL_TEX_COORD_ARRAY on the second texture unit, but both calls are need for the desired result. Hope this helps anyone else that may be trying to understand this.
Now it's just time to learn how to use the combiners, thanks for pointing me in the right direction Hodgman