OpenGL学习笔记:测试

来源:互联网 发布:网络机房装修招聘 编辑:程序博客网 时间:2024/04/30 22:05
测试:
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测试的方式都是一样的,比较也有八种情况:始终通过、始终不通过、大于则通过、小于则通过、大于等于则通过、小于等于则通过、等于则通过、不等于则通过。
原创粉丝点击