OpenGL 模板缓冲stencil

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的部分不受干扰

画完之后 开启深度测试 模板写入 就这样实现了描边的功能了

你可能感兴趣的:(opengl)