【发布时间】:2017-07-25 00:07:50
【问题描述】:
我目前正在使用 MovieTexture 在 Unity 中播放电影,并应用自定义着色器以允许 Alpha 通道。问题是我需要屏蔽视频的上半部分,但似乎没有任何效果。我相信这是着色器阻止它(如果我错了,请纠正我)。
我尝试了 3 种不同的掩蔽技术:
- 视频层(四边形)上的标准蒙版组件,以黑色透明 PNG 图像作为蒙版。
- DepthMask 应用于与视频层相交的 3D 对象 - 使用影响渲染队列或绘制调用(我忘记了)的特殊着色器来防止在 3D 对象后面或内部绘制任何内容。
- 将四边形放入 Canvas 和 Panel UI 层并调整它们,使 Canvas 和面板的大小是视频层的一半。 (必须使用四边形,因为我不相信您可以将材料添加到 UI 元素?)
不幸的是,这些都没有阻止任何视频。
(这是我正在使用的 alpha 着色器:https://github.com/keijiro/AotsMovieTexture)
这也是着色器的代码:
Shader "Custom/Aots Movie Texture" {
Properties
{
_MainTex("Base Texture", 2D) = "" {}
_ColorTint("Color Tint", Color) = (0.5, 0.5, 0.5, 1)
}
CGINCLUDE
#include "UnityCG.cginc"
sampler2D _MainTex;
half4 _ColorTint;
struct v2f
{
float4 position : SV_POSITION;
float2 texcoord : TEXCOORD0;
};
v2f vert(appdata_base v)
{
v2f o;
o.position = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = v.texcoord;
return o;
}
float4 frag(v2f i) : SV_Target
{
float2 uv1 = i.texcoord;
float2 uv2 = i.texcoord;
uv1.x *= 0.5f;
uv2.x *= 0.5f;
uv2.x += 0.5f;
half4 color = tex2D(_MainTex, uv1);
half4 mask = tex2D(_MainTex, uv2);
color.rgb *= _ColorTint.rgb * 2;
color.a = mask.r * _ColorTint.a;
return color;
}
ENDCG
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="Transparent" }
Pass
{
ZTest Always Cull Off ZWrite Off
Fog { Mode off }
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
}
}
编辑:
请更详细地解释我想要做什么,我们有一个 4K 视频分为四边形。前两个四边形将是独立视频,后两个将用于 alpha 视频。我只需要隐藏顶部的两个四边形(4k 视频的上半部分),因此当视频像我链接到的着色器一样层叠在顶部时,您只会看到 alpha 通道。
【问题讨论】:
-
您好,此时您不应该使用 MoveTexture,请查看 this 帖子了解在 Unity 中播放视频的新方法。
-
嗨!我可以重写这个着色器,只剪掉视频的顶部,但也许你想要更多的东西,idk。请详细描述问题并添加截图。
-
那太棒了。我很想进入着色器,但它看起来很复杂。我将编辑主要帖子以添加我们想要完成的内容。
-
我很想知道着色器的哪一部分还可以让您操纵视频的哪一部分显示,因为我们将来可能需要对其进行一些更改。
-
程序员:感谢您的提醒。直到 2017 年正式发布之前我还在使用 5.4,但我注意到它现在已经发布了。