Проблемы со смешиванием (OpenGL)

Есть вопрос, может кто подскажет. Я пытаюсь сделать зеркальный эффект с помощью 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();
}

person Irene    schedule 26.11.2009    source источник


Ответы (1)


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

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

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

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

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

person Bahbar    schedule 27.11.2009
comment
Бабар, спасибо! glClear(GL_DEPTH_BUFFER_BIT) сработало:)) А последнюю отрисовку я убрал, толку от этого действительно не было:)) - person Irene; 27.11.2009