Реально написать шейдер который бы по контуру модели край плавно заводил в 0-альфу?
Что-то вроде мультяшной обводки, только "внутрь" и с прозрачностью.
Shader "_radial_fade"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_Range ("Range", Range (1.0, 8.0)) = 4.0
}
SubShader
{
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
Tags {"Queue" = "Transparent"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
V2F_POS_FOG;
float2 uv;
float3 normal;
float3 viewDir;
};
uniform float4 _MainTex_ST;
v2f vert(appdata_tan v)
{
v2f o;
PositionFog(v.vertex, o.pos, o.fog);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
o.normal = v.normal;
o.viewDir = ObjSpaceViewDir(v.vertex);
return o;
}
uniform sampler2D _MainTex;
uniform float _Range;
float4 frag(v2f i) : COLOR
{
float4 albedo = tex2D(_MainTex, i.uv);
float3 normal = normalize(i.normal);
float3 viewDir = normalize(i.viewDir);
float fade = dot(normal, viewDir);
fade = fade * _Range;
fade = min(fade, 1.0);
float4 c;
c.rgb = albedo;
c.a = fade;
return c;
}
ENDCG
}
}
}
А без шейдеров делов - пробить по вертексам границы нулевую альфу ... если вертексов некрасиво мало - создать полигональную кайму - всяко сэкономим на расчетах и текстурной памяти.
Shader "XRay end VertexLit" {
Properties {
_ColorX ("Tint (RGB)", Color) = (1,1,1,1)
_Min("Min",Range(-1,1)) = 0.5
_Exp("Exp",Range(0,5)) = 0.5
_Power("Power", Range (0,5)) = 0.5
_Color ("Main Color", Color) = (1,1,1,0)
_SpecColor ("Spec Color", Color) = (1,1,1,1)
_Emission ("Emmisive Color", Color) = (0,0,0,0)
_Shininess ("Shininess", Range (0.01, 1)) = 0.7
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Pass {
Material {
Diffuse [_Color]
Ambient [_Color]
Shininess [_Shininess]
Specular [_SpecColor]
Emission [_Emission]
}
Lighting On
SeperateSpecular On
SetTexture [_MainTex] {
Combine texture * primary DOUBLE, texture * primary
}
}
Pass {
Blend One One
CGPROGRAM
#pragma vertex vert
#include "UnityCG.cginc"
uniform float4 _ColorX;
uniform float _Min;
uniform float _Exp;
uniform float _Power;
struct appdata {
float4 vertex : POSITION;
float4 normal : NORMAL;
float4 color : COLOR;
};
struct v2f {
float4 pos : POSITION;
float4 color : COLOR;
};
v2f vert (appdata v) {
v2f o;
o.pos = mul( glstate.matrix.mvp, v.vertex);
float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));
float KrMin = (_Power* _Min);
float InvExp = (1.0/_Exp);
float XBorder = lerp(_Power,KrMin,pow(abs(dot(v.normal,viewDir)),InvExp));
//float XBorder = dot(viewDir,v.normal);
float4 Xcol = float4((XBorder)*_ColorX);
o.color = Xcol;
return o;
}
ENDCG
}
}
Fallback Off
}
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7