OpenGL 模板缓冲stencil
原创
©著作权归作者所有:来自51CTO博客作者日渐消瘦DBBH的原创作品,请联系作者获取转载授权,否则将追究法律责任
glEnable(GL_DEPTH_TEST);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glStencilMask(0x00); // 记得保证我们在绘制地板的时候不会更新模板缓冲
normalShader.use();
DrawFloor()
glStencilFunc(GL_ALWAYS, 1, 0xFF);
glStencilMask(0xFF);
DrawTwoContainers();
glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
glStencilMask(0x00);
glDisable(GL_DEPTH_TEST);
shaderSingleColor.use();
DrawTwoScaledUpContainers();
glStencilMask(0xFF);
glEnable(GL_DEPTH_TEST);
先开启stencil OP的参数对应sfail dfail allpass 三种情况的处理
上面的replace就是通过就把那个点的模板值变成1 keep就是保持不变
这个东西 绘制每个对象的时候都要单独设置 上面 绘制地板的时候 Mask 0x00就是不写入
后面画第一次的时候mask 0xff就开启写入 并且func是always 画箱子 写1
第二次画 func里面notequal代表不等于1的地方才画 并且无深度测试 禁止写入 这样放大的箱子就只画边框了 中间为1的部分不受干扰
画完之后 开启深度测试 模板写入 就这样实现了描边的功能了