// Тут предварительные вычисления и др
// прорисовка "дырявой" стены (!!!)
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, 1, 0);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(-2, 0, 2);
glTexCoord2f(0, 1); glVertex3f(-2, 2, 2);
glTexCoord2f(1, 1); glVertex3f(2, 2, 2);
glTexCoord2f(1, 0); glVertex3f(2, 0, 2);
glEnd();
glStencilFunc(GL_ALWAYS, 2, 0);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(-1, 0, 2);
glTexCoord2f(0, 1); glVertex3f(-1, 1, 2);
glTexCoord2f(1, 1); glVertex3f(1, 1, 2);
glTexCoord2f(1, 0); glVertex3f(1, 0, 2);
glEnd();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glStencilFunc(GL_EQUAL, 1, 255);
glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(-2, 0, 2);
glTexCoord2f(0, 1); glVertex3f(-2, 2, 2);
glTexCoord2f(1, 1); glVertex3f(2, 2, 2);
glTexCoord2f(1, 0); glVertex3f(2, 0, 2);
glEnd();
glDisable(GL_STENCIL_TEST);
// остальные стены и пол
glColor3f(0.0f, 0.0f, 1.0f);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(2, 0, 2);
glTexCoord2f(0, 1); glVertex3f(2, 2, 2);
glTexCoord2f(1, 1); glVertex3f(2, 2, -2);
glTexCoord2f(1, 0); glVertex3f(2, 0, -2);
glEnd();
...