以前主管就告诉我们,做一个专门的技术博客,对以后成长有很大帮助,但是一直没有去做,工作一年,知识杂且乱,感觉收获不大,决定从写技术博客开始。
最近因工作原因,需要用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自动渲染视频。
就酱吧,欢迎转载,转载注明出处。