Рисовать глубину сложности с трафаретным буфером? - PullRequest
0 голосов
/ 26 июня 2019

Я не могу нарисовать глубину сложности, используя буфер трафарета.

Я пытался использовать эти шаги :

void CALLBACK display(void)
{
    MatriceUmbra(points, sourcePosition, shadowMatrix);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    glLoadIdentity();
    glRotatef(50.0, 1.0, 1.0, 1.0);
    glRotatef(beta, 0, 1, 0);
    //glRotatef (gama, 1, 1, 1);


    glClear(GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_STENCIL_TEST);
    glStencilFunc(GL_ALWAYS, 0, 0);
    glStencilOp(GL_KEEP, GL_INCR, GL_INCR);

    glPushMatrix();
    pamant();
    glPushMatrix();
    glDisable(GL_LIGHTING);
    //glDisable(GL_DEPTH_TEST);
    glColor4f(0.0, 0.1, 0.0, 0.7);


    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glMultMatrixf((GLfloat*)shadowMatrix);

    glStencilFunc(GL_EQUAL, 1, 1);
    glStencilMask(GL_FALSE);
    glDisable(GL_DEPTH_TEST);

    caruta();
    glPopMatrix();
    glEnable(GL_LIGHTING);
    glEnable(GL_DEPTH_TEST);


    caruta();
    glPopMatrix();


    glFlush();

    int *data = malloc(500 * 500 * 4);
    glReadPixels(0, 0, 500, 500, GL_STENCIL_INDEX, GL_INT, data);
    glDrawPixels(500, 500, GL_COLOR_INDEX, GL_INT, data);
}

void CALLBACK myReshape(GLsizei w, GLsizei h)
{
    if (!h) return;
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (w <= h)
        glOrtho(-400, 400, -400 * (GLfloat)h / (GLfloat)w, 400 * (GLfloat)h / (GLfloat)w, -600.0, 600.0);
    else
        glOrtho(-400 * (GLfloat)w / (GLfloat)h, 400 * (GLfloat)w / (GLfloat)h, -400, 400, -600.0, 600.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

int main(int argc, char** argv)
{
    auxInitDisplayMode(AUX_SINGLE | AUX_RGB | AUX_DEPTH16 | AUX_STENCIL);
    auxInitPosition(0, 0, 500, 500);
    auxInitWindow("Iluminarea");
    myinit();
    auxKeyFunc(AUX_RIGHT, inainte);
    auxKeyFunc(AUX_LEFT, inapoi);
    auxKeyFunc(AUX_UP, interiorul_carutei);
    auxReshapeFunc(myReshape);
    auxMainLoop(display);
    return(0);
}

В настоящее время я вижу начальную сцену и не вижу сложности глубины как сцены.

Мой объект - тележка, и я ее вижу, но я также попытался нарисовать глубину сложности, как я упоминал ранее в ссылке.

Вот шаги, которые я попытался безуспешно:

  • Очистить буфер глубины и трафарета:

    glClear(GL_STENCIL_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    
  • Включить трафарет:

    glEnable(GL_STENCIL_TEST)
    
  • Установите правильные параметры трафарета:

    glStencilFunc(GL_ALWAYS, 0, 0)
    glStencilOp(GL_KEEP, GL_INCR, GL_INCR)
    
  • Нарисуйте сцену.

  • Считать буфер трафарета с помощью glReadPixels(), используя GL_STENCIL_INDEX в качестве аргумента формата.
  • Нарисуйте буфер трафарета на экране, используя glDrawPixels() с GL_COLOR_INDEX в качестве аргумента формата.

1 Ответ

0 голосов
/ 26 июня 2019

OpenGL - это государственный двигатель.Как только состояние установлено, состояние сохраняется до тех пор, пока оно не будет изменено снова, даже за пределами кадров.
Далее обратите внимание, что параметр glStencilMask() является битовой маской, а не логическим значением.

Значение, установленное на glStencilMask(), влияет на запись всего буфера трафарета, даже glClear.

В середине display(), связывание с трафаретомбуфер отключен

glStencilMask(GL_FALSE);

Обратите внимание, что параметр должен быть 0x00, а не GL_FALSE, но, поскольку GL_FALSE равен 0, это не имеет значенияcase.

Это значение сохраняется и больше никогда не изменяется.Вы должны включить запись буфера трафарета в начале display(), до glClear():

void CALLBACK display(void)
{
    MatriceUmbra(points, sourcePosition, shadowMatrix);

    glStencilMask(0xff); // <----- this is missing

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    glEnable(GL_STENCIL_TEST);
    glStencilFunc(GL_ALWAYS, 0, 0);
    glStencilOp(GL_KEEP, GL_INCR, GL_INCR);


    // ...

    glStencilFunc(GL_EQUAL, 1, 1);
    glStencilMask(0x00);

    // ...
}
...