unity优化unity3D技术分享Unity3D游戏开发

Unity3D消除绿幕

2017-01-03  本文已影响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自动渲染视频。

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

上一篇下一篇

猜你喜欢

热点阅读