Если приложение использует OpenGL, то достаточно будет написать функцию-обертку к glColor (ну и к glMaterial и glLight, если они используются) примерно такого вида: void SetColor(float R, float G, float B, float A)
{
if (!NightMode)
glColor4f(R, G, B, A);
else
glColor4f(R, 0, 0 A);
}
ertaquo: ваше решение c подменой glColor не даст никакого результата к примеру с текстурами или если у объекта свой массив цветов, а это 90% случаев. Для этих целей существует glColorMask, который работает как в OpenGLES1 так и в OpenGLES2. Шейдеры в iPhone есть начиная с 3GS модели, можно и на них.
Про glColorMask сам не знал, каюсь. С текстурами мой способ результат даст, потому что в OpenGL при отображении текстурированного полигона происходит смешивание цветов (поэтому и делают glColor4f(1, 1, 1, 1) перед отрисовкой текстурированного полигона). В случае с массивом цветов — да, не поможет, если этот массив перед отображением не обработать.
В любом случае ваше решение с glColorMask универсальнее :)