Cesium 视频融合中的 MSAA实验

使用阴影贴图将视频纹理贴到模型上是视频融合的常用手段之一

但是纹理的边界常常会比较突兀 不能较好的融合到场景中

用一定手段对边界进行虚化可以提升融合的效果

对于这种遮挡效果较为简单的融合来说 对视频边界进行处理就可以达到较好的融合效果

但是若想实现更为复杂的虚化 就要考虑更复杂的情况了

这里想借鉴MSAA的反走样方法

做一个类似滤波器的东西 来进行卷积运算 当然是在像素空间进行的

想要实现的效果是即使遮挡关系较复杂

比如纹理一半在一个广告牌上 另一半在地上 也可以实现较好的虚化效果

思路是以当前像素为中心 3*3的范围建立一个卷积场 判断周围八个坐标是否是投影的区域

若是投影的区域则count加一 最后把这个系数返回作为一个透明度

    float getAlpha(float xx,float yy)//传入当前像素坐标  进行卷积 在3*3邻域内判断
    {
      float x=xx;
      float y=yy;

      int count=0;
      for(int i=-1;i<2;i++)
        {
            for (int j=-1;j<2;j++)
            {
                
                float newx =x+float(i);
                float newy =y+float(j);
                vec2 newpoint=vec2(newx/viewport_w[0][2],newy/viewport_w[0][2]);
        
                float MainDepth1_new=czm_unpackDepth(texture(depthTexture, newpoint.xy));
                float MainDepth2_new= czm_reverseLogDepth(MainDepth1_new);
           
        
                vec4 MainInfo1_new=vec4(newpoint.x*2.0-1.0,newpoint.y*2.0-1.0, MainDepth2_new*2.0-1.0,1.0);
                vec4 MainInfo7_new=MainMAX*MainInfo1_new;//[-1-1]->[0-1]
             
                MainInfo7_new = MainInfo7_new/MainInfo7_new.w;
                if(MainInfo7_new.w+0.0005>0.0&&MainInfo7_new.x+0.0005>= 0.0&&MainInfo7_new.x-0.005<=MainInfo7_new.w&&MainInfo7_new.y-0.005<=MainInfo7_new.w&&MainInfo7_new.y+0.005>=0.0&&MainInfo7_new.z+0.0001<=MainInfo7_new.w&&MainInfo7_new.z+0.005>=0.0){
                    float CameraDepth_new = czm_unpackDepth(texture(CameraDepthTexture, MainInfo7_new.xy));
                    float CameraDepth1_new= my_reverseLogDepth(CameraDepth_new);
                 
                    if(MainInfo7_new.z-z_offset<=CameraDepth1_new)
                    {
                        count++;
                    }
                }
                }
        }
        
      return 1.0/9.0*float(count);
    }
  alpha_video=getAlpha(gl_FragCoord.x,gl_FragCoord.y);
            b=1.0-alpha_video;
//           out_FragColor=vec4(b,b,b,1.0);
           out_FragColor=vec4(videos.x*alpha_video+BaseColor.x*b,videos.y*alpha_video+BaseColor.y*b,videos.z*alpha_video+BaseColor.z*b,1.0);

但是并没有达到想要的效果

没有实现虚化不说 随着镜头变化 很多区域甚至透明度变成0了

这是什么原因呢?

     float newx =x+float(0);
     float newy =y+float(0);

把步长都设为0 按理说这就是用原来的点反复判断了九次 

应该等于什么都没做 结果纹理还是随着视点变化一直变 

这就很奇怪了 难道是变换矩阵传进来有问题吗

晕  检查了一下才发现

 vec2 newpoint=vec2(newx/viewport_w[0][2],newy/viewport_w[0][2]); 这里写错了

归一化应该是

 vec2 newpoint=vec2(newx/viewport_w[0][2],newy/viewport_w[0][3]);

这样不会随着视点乱动了 但是好像虚化效果也没有

可能是邻域范围实在是太小了 仅在边缘一点点过渡效果 

虚化前:

换成十邻域效果也没好多少 感觉增加邻域个数不是好思路

提高到100邻域 确实效果好很多 但是性能开销太大了 完全不可行 而且统计范围过大也会影响效果

而且从纹理边界的情况来看似乎没有虚化效果 就是模糊?

对比处理前的 似乎没有什么区别

难道说这种虚化和抗锯齿并不能混为一谈  抗锯齿一般需要用优化的像素块较少

虚化想要达到合理的过渡效果需要涉及的区域还是比较大的

十邻域时可识别出来的用作过渡的区域 感觉也不算太小了 但还是不够用

要做的事情就是根据这些类似边缘一样的区域 进行一个过渡 

换成30*30的邻域 这样帧数还在可接受范围内  那如果以这个邻域过渡呢?

效果还是一般 突然想到 给返回的系数乘个5次方 效果会不会好一些?

相当于放大了值比较低的区域 即给予模型的纹理更多比重

过渡效果要好于直接返回 单总感觉还是不完美 过渡区域还是太少了 总是不能两全

而且30*30 帧数也不是很高

可以说 要是目的只是抗锯齿 还是有一定效果  要是想要平滑的过渡还是差点

上面的是开启本文滤波 细节处锯齿要少

要想办法扩大这个过渡区域才能更平滑的过渡  这个区域太少了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值