A 3D polygon, like the tiles in the grid that performs the page turn have a front face and back face. What you want is that the back face, which is the transformed part of the grid has a white color instead of the texture. Luckily OpenGL can separate front and back faces by their vertices winding. Normally a CCW (counter clock wise) winding stands for the front face and CW for the back face of a polygon. Another useful technique is culling, which instructs the renderer to discard the front or back face of a polygon completely.
Combine the two and that's almost enough to get it working.
Edit, this code is fully working.
the blit method of CCGrid3D
-(void)blit
{
NSInteger n = gridSize_.x * gridSize_.y;
// Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
// Needed states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_TEXTURE_COORD_ARRAY
// Unneeded states: GL_COLOR_ARRAY
//enable culling, the default cull face is back
glEnable(GL_CULL_FACE);
//now only the front facing polygons are drawn
glDisableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT, 0, texCoordinates);
glDrawElements(GL_TRIANGLES, (GLsizei) n*6, GL_UNSIGNED_SHORT, indices);
//change the winding of what OpenGl considers front facing
//only the back facing polygons will be drawn
//this works better then changing the cull face
glFrontFace(GL_CW);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glColor4ub(255,255,255,255);
glDrawElements(GL_TRIANGLES, (GLsizei) n*6, GL_UNSIGNED_SHORT, indices);
//restore GL default states
glFrontFace(GL_CCW);
glDisable(GL_CULL_FACE);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
}
Basically the grid is drawn twice, so it will perform slower than the original. But due to the dismissing of front/back facing polygons it won't be twice as computational intense.
You'll need to do some proper subclassing to get this working nicely, without affecting other effects that rely on CCGrid3D.