最近作課題的時候須要計算一個 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; }
必定要記得在對應的幀緩衝中使用。渲染