diff --git a/README.md b/README.md index 3ccf518..4ad5bb0 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ Fork自 https://github.com/GunwooHan/EasyVtuber 并且省略了ifacialmocap pc端,通过UDP直连的方式使ios面捕刷新率达到30fps,解决了面捕刷新率的瓶颈 最后,将EasyVtuber中使用的OBS虚拟摄像头方案切换为Unity Capture,解锁RGBA输出能力,无需绿背即可直接使用 +[视频介绍和安装说明](https://www.bilibili.com/video/BV1uu411r7DR) + ## Requirements ### 硬件 @@ -87,6 +89,20 @@ https://github.com/pkhungurn/talking-head-anime-2-demo#download-the-model ### 输入输出设备 +#### OBS Virtual Camera + +目前更推荐这个方案,UnityCapture存在未查明的性能瓶颈 +如果你选择自己进行抠像你可以直接输出到obs,如果你需要RGBA支持则需要额外使用一个Shader +下载并安装StreamFX https://github.com/Xaymar/obs-StreamFX +下载Shader(感谢树根的协助) https://github.com/shugen002/shader/blob/master/merge%20alpha2.hlsl +之后,使用`--alpha_split`参数运行 +![alpha split](assets/alphasplit.png) +你会看到这样的输出画面,透明通道单独使用灰度方式发送了 +之后对OBS中的视频采集设备添加滤镜-着色器-选择你下载的`merge alpha2.hlsl`-关闭 +这样透明通道就应用回左边的图像了 +你可能需要手动调整一下裁剪把右侧的无用画面切掉 +(看不到着色器滤镜的话就是StreamFX没装好或者OBS不是最新版) + #### UnityCapture 如果需要使用透明通道输出,参考 https://github.com/schellingb/UnityCapture#installation 安装好UnityCapture diff --git a/assets/alphasplit.png b/assets/alphasplit.png new file mode 100644 index 0000000..1d04552 Binary files /dev/null and b/assets/alphasplit.png differ diff --git a/obs_shader/merge alpha2.hlsl b/obs_shader/merge alpha2.hlsl deleted file mode 100644 index 151a35f..0000000 --- a/obs_shader/merge alpha2.hlsl +++ /dev/null @@ -1,43 +0,0 @@ -uniform float4x4 ViewProj< - bool automatic = true; - string name = "View Projection Matrix"; ->; -uniform texture2d InputA< - bool automatic = true; ->; - -uniform int mode; - -sampler_state textureSampler { - Filter = Linear; - AddressU = Clamp; - AddressV = Clamp; -}; - -struct VertData { - float4 pos : POSITION; - float2 uv : TEXCOORD0; -}; - -VertData VSDefault(VertData vtx) -{ - vtx.pos = mul(float4(vtx.pos.xyz, 1.0), ViewProj); - return vtx; -} - -float4 PSAlphaFilter(VertData vtx) : TARGET -{ - float2 uv = vtx.uv; - float3 pixel = InputA.Sample(textureSampler, float2(vtx.uv.x, vtx.uv.y)).rgb; - float alpha = InputA.Sample(textureSampler, float2(vtx.uv.x + 0.5, vtx.uv.y)).g; - return float4(clamp(pixel.rgb / alpha, 0.0, 1.0), alpha); -} - -technique Draw -{ - pass - { - vertex_shader = VSDefault(vtx); - pixel_shader = PSAlphaFilter(vtx); - } -} \ No newline at end of file