• 进一步使用 模板缓冲(stencil)


      

      最近做课题的时候需要计算一个 view(就是一次渲染得到的帧) 下的重叠像素个数(两个物体或更多的物体重叠)。

    • 最开始我的想法是渲染一个物体输出一张纹理,这样对比物体之间的纹理就知道重叠了。但是这样当物体很多的时候需要输出太多的纹理到CPU,太慢了,也很麻烦。
    • 后来和同学讨论了一下,觉得是不是可以使用一张纹理作为帧缓冲的输出,同时作为片段着色器的输入,这样可以每渲染一个像素点加1,最终大于1的位置表示重叠。但是后来这样试了,在片段着色器中采样这张纹理的时候,采样出来的值明显不对,没有随着渲染一个物体后再次采样会逐步积累增加。(感觉因为是同一张纹理,但是是输入和输出,在GPU中分配了两个存储位置,各自使用自己的,所以没有叠加,我瞎猜的……)
    • 后来查到仿佛可以使用累积缓冲,每次渲染的结果叠加在一起,但是需要加权,value = α*value + (1-α)*newvalue ,感觉不太好操作,放弃了。
    • 最后看了一下stencil,发现可以实现我需要的功能。虽然几个月前看过一次,但是当时没有太懂,这次算是理解了。

      

      现在再来回顾一下 Stencil 的用法:

    • glStencilMask(value) 位遮罩, value=0x00表示模板缓冲不可写入;value=0xFF表示可以写入。
    • void glStencilFunc(GLenum func, GLint ref, GLuint mask)  指定ref值与存储的模板值对比
    • void glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass) 指定模板值的写入策略

      

      流程代码

            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); //关闭模板写入

      遇到的坑是清空模板缓冲前一定要开启模板写入!!!

      模板值读取:

        这个耽搁了很久,开始是附加模板纹理到帧缓冲中,然后从纹理中读取值,但是怎么都读出来不对……

        后来发现可以直接使用其API读取   glReadPixels 。

        使用此API读取时,其是直接面向当前帧缓冲获取模板值数据,故与模板生成方式无关,可以是默认屏幕的帧缓冲,也可以使自己生成的帧缓冲(可以是RBO模板缓冲、模板缓冲纹理、深度-模板缓冲纹理)。

    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;
    }

      一定要记得在对应的帧缓冲中使用。

      

      

  • 相关阅读:
    【Oracle】导入导出操作
    高德交通态势地址
    UML类图Java
    【SQL】数据库模糊查询
    【数据库】Java中数据库连接池原理机制的详细讲解
    随笔-使用时间管理有感
    【structs2】>>> FilterDispatcher <<< is deprecated!
    【算法】排序算法之插入排序
    【CSS】命名规范
    【JQuery】15个值得开发人员关注的jQuery开发技巧和心得
  • 原文地址:https://www.cnblogs.com/chen9510/p/11806269.html
Copyright © 2020-2023  润新知