最近作课题的时候须要计算一个 view(就是一次渲染获得的帧) 下的重叠像素个数(两个物体或更多的物体重叠)。ui
如今再来回顾一下 Stencil 的用法:this
流程代码spa
glEnable(GL_DEPTH_TEST); glEnable(GL_STENCIL_TEST); glStencilMask(0xFF); //开启模板写入 (清空模板缓冲须要开启模板写入!!!) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // 咱们如今使用模板缓冲 glStencilOp(GL_INCR, GL_INCR, GL_INCR); glStencilMask(0x00); //关闭模板写入 this->DrawSkyBox(false); this->DrawFloor(false); glStencilFunc(GL_ALWAYS, 1, 0xFF); glStencilMask(0xFF); //开启模板写入 this->DrawBuildings(false); // 先渲染building,shader中的编号保持一致,可是sky必定在前 glStencilMask(0x00); //关闭模板写入
遇到的坑是清空模板缓冲前必定要开启模板写入!!!code
模板值读取:blog
这个耽搁了好久,开始是附加模板纹理到帧缓冲中,而后从纹理中读取值,可是怎么都读出来不对……ci
后来发现能够直接使用其API读取 glReadPixels 。模板
使用此API读取时,其是直接面向当前帧缓冲获取模板值数据,故与模板生成方式无关,能够是默认屏幕的帧缓冲,也可使本身生成的帧缓冲(能够是RBO模板缓冲、模板缓冲纹理、深度-模板缓冲纹理)。class
float* WKS::Texture::GetStencilData(GLuint width, GLuint height) { float* pixels = new float[width * height]; glReadPixels(0, 0, width, height, GL_STENCIL_INDEX, GL_FLOAT, pixels); return pixels; }
必定要记得在对应的帧缓冲中使用。渲染