使用模板缓冲区绘制深度复杂度吗?

时间:2019-06-26 16:08:04

标签: c opengl opengl-compat

我无法使用模板缓冲区绘制深度复杂度。

我尝试使用these steps

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 :(得分:0)

OpenGL是一个状态引擎。设置状态后,状态会一直保存到再次更改为止,甚至超出帧数。
还要注意,glStencilMask()的参数是位掩码而不是布尔值。

设置为glStencilMask()的值会影响所有模板缓冲区的写入,甚至会影响glClear

display()的中间,禁止写入模板缓冲区

glStencilMask(GL_FALSE);

请注意,参数应为0x00而不是GL_FALSE,但是由于GL_FALSE0,因此在这种情况下无关紧要。

该值将保持不变,并且不会再次更改。您必须在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);

    // ...
}