Вопрос

У меня есть вопрос, может быть, кто-то может мне помочь. Я пытаюсь создать зеркальный эффект, используя OpenGL. Я рисую прозрачную плоскость, «отраженную». сцена, вырезанная по трафарету, и оригинальная. Но у меня совершенно непрозрачная "стена" вместо зеркала. Я знаю, что это происходит из-за первого рендеринга плоскости зеркала (чтобы получить буфер трафарета). Но я не знаю, что с этим делать :( Вот код:

  void CMirror::draw(CSceneObject * curscene)
{
    glPushMatrix();
    glClearStencil(0.0f);

    glClear(GL_STENCIL_BUFFER_BIT);
    //Draw into the stencil buffer
    glDisable(GL_LIGHTING);
    glDisable(GL_TEXTURE_2D);
    glStencilFunc(GL_ALWAYS, 1, 0);
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
    glEnable(GL_STENCIL_TEST);
    glPushMatrix();
    glTranslatef(this->coords[0], this->coords[1], this->coords[2]);
    glScalef(this->size, this->size, this->size);
    glColor4f(1, 0, 1, 0);
    glBegin(GL_QUADS);
        glVertex3f(0.0f, this->height / 2.0f, this->width / 2.0f);
        glVertex3f(0.0f, this->height / -2.0f, this->width / 2.0f);
        glVertex3f(0.0f, this->height / -2.0f, this->width / -2.0f);
        glVertex3f(0.0f, this->height / 2.0f, this->width / -2.0f);
    glEnd();
    glPopMatrix();
    glDisable(GL_STENCIL_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_TEXTURE_2D);
    //glClear(GL_COLOR_BUFFER_BIT);
    //Draw the scene
    glEnable(GL_STENCIL_TEST);  
    glStencilFunc(GL_EQUAL, 1, 255);
    glPushMatrix();
    glTranslatef( 2*this->coords[0], 2*this->coords[1], 2*this->coords[2]);
    glScalef(-1.0f, 1.0f, 1.0f);
    ((CScene*)curscene)->draw();
    glColor4f(0.0f, 0.30f, 0, 0.9); 
    ((CScene*)curscene)->spline->draw();
    ((CScene*)curscene)->morph->draw();


    glPopMatrix();
    glDisable(GL_STENCIL_TEST);
    //the mirror itself:
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);
    glPushMatrix();
    glTranslatef(this->coords[0], this->coords[1], this->coords[2]);
    glScalef(this->size, this->size, this->size);
    glColor4f(0, 0, 0, 0.9);
    glBegin(GL_QUADS);
        glVertex3f(0.0f, this->height / 2.0f, this->width / 2.0f);
        glVertex3f(0.0f, this->height / -2.0f, this->width / 2.0f);
        glVertex3f(0.0f, this->height / -2.0f, this->width / -2.0f);
        glVertex3f(0.0f, this->height / 2.0f, this->width / -2.0f);
    glEnd();
    glPopMatrix();
    glDisable(GL_BLEND);

    glPopMatrix();
}
Это было полезно?

Решение

Что произойдет, если вы не проведете этот последний розыгрыш (т. е. если проблема все еще существует, удалите ее, поскольку это усложняет пример)?

Ясно одно, что вы, похоже, не обрабатываете ничего, связанного с Z-буфером.

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

Вам нужно как-то очистить Z-буфер для этой области экрана. Очевидно, что полная Clear (DEPTH_BIT) может работать, но это зависит от того, что вы уже нарисовали на своем экране.

Аналогичным образом, отсутствие обновления Z-буфера при обновлении трафарета может работать в зависимости от того, было ли что-либо нарисовано там ранее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top