利用OpenGL模板緩衝,從正方形中摳出一個圓形邊框

#include<GL/freeglut.h>
#include<math.h>

void init()
{

    /*

       color buffer,stencil buffer清除色, 使能模板測試

     */


    glClearColor(1.0,0.0,0.0,1.0);
    glShadeModel(GL_FLAT);
    glClearStencil(0);
    glEnable(GL_STENCIL_TEST);
}

void myReshape(GLsizei w, GLsizei h)
{
    glViewport(0,0,w,h);

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    gluOrtho2D(-1.0, 1.0, -1.0, 1.0);

    glMatrixMode(GL_MODELVIEW);

}

void myDisplay()
{


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    glLoadIdentity();

 

    /*

       glStencilFunc(GL_NEVER,0xff,0xff); 使得始終通不過模板測試,這樣只會寫模板緩衝區,繪製的東西不會落在顏色緩衝區

       glStencilOp後的三個參數分別表示在模板測試失敗、模板測試通過,但深度測試未通過、模板測試盒深度測試均通過的情況下

       GL_INCR_WRAP表示將模板緩衝值自增1,如果超過了最大值,則從0開始

     */

 

    glStencilFunc(GL_NEVER,0xff,0xff);

    glStencilOp(GL_INCR_WRAP,GL_INCR_WRAP,GL_INCR_WRAP);

    GLdouble dRadius = 0.5;

    glBegin(GL_LINE_LOOP);

    for(double angle =  0.0; angle < 3.1415926 * 2; angle+= 0.001)
    {
        glVertex2d(dRadius * cos(angle), dRadius * sin(angle));
    }

    glEnd();

 

    /*

       如果最低位與1相與之後不等於1,則通過模板測試,此時顏色值被寫到最終的color buffer中

       所以這種利用模板緩衝區的場景需要二遍繪製,才能達到最終的效果

     */

 

    glStencilFunc(GL_NOTEQUAL,0x1,0x1);
    glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);

    glColor3f(0.0,1.0,1.0);

    glRectf(-0.8f,-0.8f,0.8f,0.8f);

    glutSwapBuffers();

}

int main(int argc, char** argv)
{
    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_STENCIL);

    glutInitWindowSize(400,400);

    glutInitWindowPosition(200,200);

    glutCreateWindow("stencil test");

    init();

    glutReshapeFunc(myReshape);
    glutDisplayFunc(myDisplay);

    glutMainLoop();

    return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章