Unity3D消除绿幕

作者: 啊安 | 来源:发表于2017-01-03 22:42 被阅读555次

    以前主管就告诉我们,做一个专门的技术博客,对以后成长有很大帮助,但是一直没有去做,工作一年,知识杂且乱,感觉收获不大,决定从写技术博客开始。

    最近因工作原因,需要用unity实现 播放 消除 绿幕的视频。

    首先从游戏蛮牛里面找到一个相关的文章,从文章中,大致了解到,可以使用shader来进行绿幕消除,但是CG语言小弟以前从来未接触过,表示看不懂。

    后来找到了一个过滤颜色的文章,于是我复制了作者的shader代码。

    首先新建一个shader,双击打开编辑代码,把文章中的代码复制下来,主要起作用的代码是以下的方法:

    float4 fragment_convert(Inputfragment o) : COLOR{

    float4 c = tex2D(_MainTex,o.uv);

    return c;

    }

    该方法可以引用到使用该shader的材质上的RGBA值,然后我就根据代码大概意思,写出了以下代码

    float4 fragment_convert(Inputfragment o) : COLOR{

    float4 c = tex2D(_MainTex,o.uv);

    //简单的判断材质的RGB值

    if (c.g >0.5&&c.b<0.5&&c.r<0.5){

    c.a = 0;//材质的绿色大到一定程度,并且蓝色和红色小到一定程度,就把该部分的材质的透明度设置为0

    }

    return c;

    }

    shader代码写好后,新建一个材质球,把shader赋予材质球,把材质球赋予指定的播放容器。

    然后把播放视频代码的赋予到播放容器上即可。直接播放视频,会发现视频上的绿色部分被消除,但是并不能完全消除干净,CG代码有待优化。

    绿幕消除前后对比:

    以下是shader代码和播放视频代码

    链接:http://pan.baidu.com/s/1eSiLzpg 密码:ul22

    PS:以上描述虽然简单,但是在毫无基础的情况下,真是苦苦搜索而不得入门。

    其中有几个坑:

    1.不知道关键代码在何处,后来才认知到该方法能捕抓材质RGBA。

    2.不清楚CG语言中RGBA值的范围,一直使用了0~255的值域,所以久久得不到正确的结果,后来才发现CG语言中RGBA的值域是0~1。

    3.不熟悉shader玩法的情况下,不知道应该如何把shader和视频关联起来,后来才发现,把shader绑到容器里,就会使用该shader自动渲染视频。

    就酱吧,欢迎转载,转载注明出处

    相关文章

      网友评论

      • e6f5470edfc3:推荐一个更好一个的网站
        e6f5470edfc3:@啊安 泰斗社区,专门的unity网站,你可以加我QQ:2109365042详谈
        啊安:@啷哩个啷儿 啥网站

      本文标题:Unity3D消除绿幕

      本文链接:https://www.haomeiwen.com/subject/fwinvttx.html