OpenGL模板测试流程

模板测试流程

不考虑earlyZ的情况下,fragment执行后,进行模板测试,通过后,进入深度测试

模板测试一般使用流程:

1. 启用模板缓冲写入
2. 渲染物体,更新模板缓冲
3. 禁用模板缓冲写入
4. 渲染其他物体,根据模板缓冲内容决定是否丢弃片段
使用模板测试绘制物体轮廓的例子
1
2
3
glStencilMask();
glStencilFunc(GLenum func, GLint ref, GLuint mask);
glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass);
1. 开启模板测试和深度测试 2. 第一次render pass,主要是绘制,并写入模板 1. 开启模板测试和深度测试 2. glStencilMask(0xFF); 3. glStencilOp(keep, keep, replace); 4. glStencilFunc(always, 1, 0xFF); 5. 绘制物体 3. 第二次render pass, 放大物体,通过模板测试剔除非边缘像素 1. 将物体缩放变大 2. 关闭深度测试 //因为这里的边缘不需要有拓扑关系 3. 关闭模板写入glStencilMask(0x00); 4. glStencilFunc(not_equal, 1, 0xFF); 5. 绘制物体

关于OpenGL里面的Mask

1. 写入颜色是,r,g,b,a 分别与对应的mask,进行&运算后写入
2. depth也是同样道理,如果设置成true,就是允许写入,设置成false,不允许写入
3. stencil的Mask,是0xFF~0x00,之间的256个数,一般设置是0xFF,允许任意值写入,0x00是不允许写入