OpenGL Water Reflection

Я пытаюсь отразить кучу деревьев из леса в соседнем озере. Я выполнил все стандартные шаги, чтобы нарисовать отражение с помощью буфера трафарета. Но "вода", кажется, не позволяет увидеть объекты ниже. Это моя функция: draw_sea() - составляет план, на котором следует отразить и drawFigTree(fig_tree) - рисует деревья ниже. Где проблема?

void draw_mirror() 
{
    glEnable(GL_STENCIL_TEST);
    //glColorMask(0, 0, 0, 0);
    glDisable(GL_DEPTH_TEST);
    glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFF);
    glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
    glDisable(GL_LIGHTING);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    draw_sea();
    glDisable(GL_BLEND);
    glEnable(GL_LIGHTING);
    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
    glEnable(GL_DEPTH_TEST);
    glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
    glPushMatrix();
    glTranslatef(0.0, SEA_LEVEL, 0.0);
    glEnable(GL_CLIP_PLANE0);
    glClipPlane(GL_CLIP_PLANE0, clip_plane0 );
    glPopMatrix();
    glPushMatrix();
    glTranslatef(-25.0, 2*(-1), 0.0);
    glScalef(1.0, -1.0, 1.0);

    drawFigTree(fig_tree);
    glPopMatrix();
    glDisable(GL_CLIP_PLANE0);
    glDisable(GL_STENCIL_TEST);
}

2 ответа

Решение

Смешивание не работает вместе с глубинным тестированием. Чтобы смешивание работало, вы должны сортировать видимые поверхности далеко-близко. В случае воды вы должны сначала нарисовать отражение (это как смотреть "сквозь" поверхность воды на отраженную сцену), а затем воду.

    glDisable(GL_DEPTH_TEST);

Вы правы в отключении тестов глубины. Но вы также должны отключить глубину записи; в противном случае вы будете загрязнять буфер глубины, когда придет время визуализации отраженной геометрии.

glDepthMask(GL_FALSE);

Примечание: не забудьте снова включить запись глубины после рендеринга озера.

Другие вопросы по тегам