使用阴影贴图将视频纹理贴到模型上是视频融合的常用手段之一
但是纹理的边界常常会比较突兀 不能较好的融合到场景中
用一定手段对边界进行虚化可以提升融合的效果
对于这种遮挡效果较为简单的融合来说 对视频边界进行处理就可以达到较好的融合效果
但是若想实现更为复杂的虚化 就要考虑更复杂的情况了
这里想借鉴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 帧数也不是很高
可以说 要是目的只是抗锯齿 还是有一定效果 要是想要平滑的过渡还是差点
上面的是开启本文滤波 细节处锯齿要少
要想办法扩大这个过渡区域才能更平滑的过渡 这个区域太少了