OpenGL模板缓冲区与模板测试
作者:网络转载 发布时间:[ 2014/1/22 11:15:47 ] 推荐标签:OpenGL 模板 测试
初始清除背景填充颜色为蓝色
以上这部分代码可以用如下3张图表示绘制的过程

开启模板缓冲区
void init()
{
glClearColor(0,0,1.0,0);
glClearStencil(0);
glClearDepth(1.0f);
glEnable(GL_STENCIL_TEST);
}
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);//1
glLoadIdentity();
glTranslatef(0, 0, -20);
glStencilFunc(GL_NEVER,0x0,0xFF); //2
glStencilOp(GL_INCR,GL_INCR,GL_INCR);//3
glColor3f(1.0f,1.0f,1.0f);
dRadius = 5.0*(sqrt(2.0)/2.0);
glBegin(GL_LINE_STRIP);
for (dAngel=0;dAngel<380.0;dAngel+=0.1)
{
glVertex2d(dRadius*cos(dAngel),dRadius*sin(dAngel));
dRadius*=1.003;
}
glEnd();
glStencilFunc(GL_NOTEQUAL,0x1,0xFF); //4
glStencilOp(GL_KEEP,GL_KEEP,KEEP); //5
glColor3f(1.0f,0.0f,0.0f);
glRectf(-5,-5,5,5);
当执行到1处,3个缓冲区都被清空
颜色缓冲区:每个像素点颜色都是蓝色
深度缓冲区:每个像素点深度都是1.0
模板缓冲区:每个像素点模板值都是0
执行到2,3处,模板测试条件是从不通过测试,如果不通过测试结果是模板值+1
接着应用模板测试进行绘制一组点,由于模板测试条件是从不通过测试,所以颜色缓冲器值不会变化,但是绘制的点对应的像素点的模板值变为1,此时
颜色缓冲区:每个像素点颜色都是蓝色
深度缓冲区:每个像素点深度都是1.0
模板缓冲区:点数组对应的模板值是1,其他区域像素点的模板值还是0
执行到4,5处,模板测试条件是模板值不一定1则通过测试,如果不通过测试结果是模板值+1
接着应用刚才的模板测试进行绘制一个(-5,-5,5,5)的矩形,在这个矩形区域内,像素点的模板值分为2中,值为1的是上1步的点数组。值为0的是上一步非的点数组像素点。那个根据模板测试条件,模板值为0的像素点通过测试,可以进行替换颜色缓冲区的值(替换成红色),模板值为0的像素点不能通过测试,因此不能改变颜色缓冲区的值
颜色缓冲区:(-5,-5,5,5)区域内 模板值为0的像素点为红色,其他区域都为蓝色
深度缓冲区:每个像素点深度都是1.0
模板缓冲区:点数组对应的模板值是1,其他区域像素点的模板值还是0


sales@spasvo.com