OpenGL学习笔记:测试

测试:
OpenGL里面有各种测试,只有通过测试的像素才会被绘制,否则根本不会被画出来。

OpenGL测试的顺序是:剪裁测试、Alpha测试、模板测试、深度测试。如果某项测试不通过,则不会进行下一步

比如深度测试,当一个像素被绘制,该像素的深度被记录在深度缓冲区。当新的像素即将覆盖旧的像素时,深度测试会检查新的深度比旧的深度如何,如果小,覆盖成功。如果大,测试失败,绘制取消。

OpenGL有:
            深度测试
            Alpha测试
            剪裁测试
            模板测试

剪裁测试(Scissor):
           剪裁测试是限制绘制区域。指定一个剪裁矩形,则只有该矩形中的像素才会被绘制。这就是剪裁测试。
      启动测试:
            glEnable(GL_SCISSOR_TEST);
     设置剪裁矩形:
          glScissor();

注意,OpenGL窗口坐标是以左下角为(0, 0),右上角为(width, height)的,这与Windows系统窗口有所不同。

剪裁测试和视口变换的区别:视口变换是把所有的内容经过缩放,都装在一个视口矩形里面,所有内容都在。剪裁测试没有缩放,只简单的显示剪裁矩形内的内容,矩形外的内容会被丢掉。

Alpha测试:
           
Alpha值除了用于混合,还能用于Alpha测试。所谓Alpha测试,是指Alpha值满足于特定值的像素才能被绘制,否则no。条件一般是:
            始终通过/始终不通过
            大于则通过/小于则通过
            等于/不等于/大等于/小等于

            启动Alpha测试:
            glEnable(GL_ALPHA_TEST);
            设置测试条件:
            glAlphaFunc

Alpha与混合的关系。Alpha测试的效果,基本都能用混合搞定,但Alpha效率高:

1. Alpha算法简单,比较就可以,混合要实现乘法

2. Alpha测试减少后续步骤,OpenGL中,如果通不过Alpha测试,则后面的模板测试和深度测试就不进行了。节约了计算时间。但混合本身不属于测试,所有像素都会经过所有测试。

     因此,所有的像素都是“透明”或“不透明”,没有“半透明”时,应该尽量采用Alpha测试而不是采用混合操作。当需要绘制半透明像素时,才采用混合操作。


模板测试(Stencil):
           
模板测试需要专门的缓冲区(模板缓冲区),深度测试也需要深度缓冲区,但是剪裁测试和Alpha测试不需要。这些缓冲区都是在初始化OpenGL时指定。
            模板测试的方式类似于Alpha测试,每个像素都有一个模板值,保存在模板缓冲区中,测试时,将设定的模板值与每个像素在缓冲区中的模板值比较,满足条件的像素则通过测试。
            glEnable(GL_STENCIL_TEST)
            glStencilFunc(, , mask).
            Mask参数提一下,相当于与运算中,即如果进行比较,则只比较像素的模板值中,相对于mask中为1的位。例如,某个像素模板值为5(二进制101),而mask的二进制值为00000011,因为只比较最后两位,5的最后两位为01
           
设置模板值的方法:
     复位模板值:glClear(GL_STENCIL_BUFFER_BIT);
     设置模板值的方式比较巧妙,是通过glStencilOp+glStencilFunc来设置的,怎么样进行呢,一切都是基于实际应用的,设想一个场景,有两张图,A图和B图,A图作为模板,B图受限制于该模板。做法如下:

1. 先绘制A图,设置glStencilOp函数,让A图总能通过模板测试,然后设置gkStencilFunc函数,让A图通过模板测试时,把模板值写入模板缓冲区。至此,模板缓冲区设置完成,就是A图

2.  绘制B图,注意,B跟A是有关系的,B要在A的基础上画,有点类似于与PS中的图层,只是这个图层是起过滤作用。现在B图的时候,模板缓冲区有内容了,则B图每个像素点,都会在模板缓冲区中去查找对应位置的模板值(即找对应的A图的像素点的模板值),如果通过测试,则绘画,不然丢弃。其实模板缓冲区中的模板值,是A图像素的值,并不是B图的,但是B图是基于A画的,也就是生在A之上,可以理解为模板缓冲区的的值,也是B图的


深度测试
            glEnable(GL_DEPTH_TEST);

glDepthFunc      

深度测试,模板测试,和Alpha测试的方式都是一样的,比较也有八种情况:始终通过、始终不通过、大于则通过、小于则通过、大于等于则通过、小于等于则通过、等于则通过、不等于则通过。

你可能感兴趣的:(算法,windows,测试,buffer)