【发布时间】:2017-07-07 15:10:23
【问题描述】:
我对着色器完全陌生,我从来没有做过
我想知道是否有可能有一个着色器可以正常渲染无光照纹理,但特定颜色除外,它应该渲染为透明
有点像绿屏,我想让着色器渲染 rgba(0,0,0,0) 而不是 rgba(0,1,0,1)
我知道我可以只使用带有 alpha 的纹理,但我需要将它用于移动设备上的视频纹理,所以我认为这是唯一的选择
提前感谢您提供的任何提示或答案
【问题讨论】:
我对着色器完全陌生,我从来没有做过
我想知道是否有可能有一个着色器可以正常渲染无光照纹理,但特定颜色除外,它应该渲染为透明
有点像绿屏,我想让着色器渲染 rgba(0,0,0,0) 而不是 rgba(0,1,0,1)
我知道我可以只使用带有 alpha 的纹理,但我需要将它用于移动设备上的视频纹理,所以我认为这是唯一的选择
提前感谢您提供的任何提示或答案
【问题讨论】:
您正在寻找色度键着色器。
this Unity forum thread 中有一些详细信息,我认为这个可以满足您的要求,尽管另一种解决方案可能会“更好”,具体取决于您可以对视频源执行的操作等。给线程一个如果可以,请阅读。
Shader "Matte/RGB Color"
{
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_Matte ("Matte Color", Color) = (1,0,1,1)
_Thresh ("Threshold", Range (0,1)) = 0.0
_Cutoff ("Cutoff", Range (0,1)) = .5
}
SubShader {
Pass {
AlphaTest Less [_Cutoff]
CGPROGRAM
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f {
float4 pos : POSITION;
float4 uv : TEXCOORD0;
};
sampler2D _MainTex;
uniform half4 _Matte;
uniform float _Thresh;
uniform float _Cutoff;
half4 frag (v2f i) : COLOR
{
//return _Matte;
half4 color = tex2D(_MainTex, i.uv.xy);
half3 keyMinus = half3( (_Matte.r - _Thresh), (_Matte.g - _Thresh), (_Matte.b - _Thresh) );
half3 keyPlus = half3( (_Matte.r + _Thresh), (_Matte.g + _Thresh), (_Matte.b + _Thresh) );
if ( ((color.r > keyMinus.r) (color.r < keyPlus.r)) ((color.g > keyMinus.g) (color.g < keyPlus.g)) ((color.b > keyMinus.b) (color.b < keyPlus.b)) )
{
return _Cutoff;
}
return float4(color.rgb, max(0, _Cutoff-0.01));
}
ENDCG
} // pass
} // subshader
//Fallback "Transparent/Diffuse"
} // shader
资产商店中还有一些资产,例如 this one ($8),可能会更好,也可能不会。
【讨论】: