2016-12-09 4 views
1

シェーダはiPad Air上のunity 5.4で正常に動作していますが、unity 5.5にアップグレードするとアウトラインが崩れますが、アルファはまだ動作しています。次いで、輪郭のオブジェクトサポートテクスチャおよびアルファUnity 5.5にアップグレードした後のアウトラインシェーダのブレーク

Shader "TFTM/Outline/Basic-Alpha" { 
Properties { 
    _Color ("Main Color", Color) = (.5,.5,.5,1) 
    _MainTex ("Base (RGB)", 2D) = "white" {} 
} 


SubShader { 
    Tags { "RenderType"="Opaque" "Queue"="Transparent" } 
    Pass { 
     Name "BASE" 
     Blend SrcAlpha OneMinusSrcAlpha 
     //Blend DstColor SrcColor 
     CGPROGRAM 
     #pragma vertex vert 
     #pragma fragment frag 
     #pragma fragmentoption ARB_precision_hint_fastest 
     #include "UnityCG.cginc" 
     sampler2D _MainTex; 
     float4 _MainTex_ST; 
     float4 _Color; 
     struct appdata { 
      float4 vertex : POSITION; 
      float2 texcoord : TEXCOORD0; 
      float3 normal : NORMAL; 
     }; 

     struct v2f { 
      float4 pos : POSITION; 
      float2 texcoord : TEXCOORD0; 
     }; 
     v2f vert (appdata v) 
     { 
      v2f o; 
      o.pos = mul (UNITY_MATRIX_MVP, v.vertex); 
      o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); 
      return o; 
     } 
     float4 frag (v2f i) : COLOR 
     { 
      float4 col = _Color * tex2D(_MainTex, i.texcoord); 
      return float4(2.0f * col.rgb, col.a); 
     } 
     ENDCG    
    } 
} 
SubShader { 
    Tags { "RenderType"="Opaque" "Queue"="Transparent"} 
    Pass { 
     Name "BASE" 
     SetTexture [_MainTex] { 
      constantColor [_Color] 
      Combine texture * constant 
     } 
    } 
} 

Fallback "VertexLit" 
} 

ため

このシェーダこのシェーダ、シェーダ上記2つのパス、第1の延伸及び輪郭を描画し、正面を間引きます。

Shader "TFTM/Outline/Basic Outline-Alpha" { 
    Properties { 
     _Color ("Main Color", Color) = (.5,.5,.5,1) 
     _OutlineColor ("Outline Color", Color) = (0,0,0,1) 
     _Outline ("Outline width", Range (0, 0.02)) = 0 
     _MainTex ("Base (RGB)", 2D) = "white" { } 
    } 

CGINCLUDE 
#include "UnityCG.cginc" 

struct appdata { 
    float4 vertex : POSITION; 
    float3 normal : NORMAL; 
}; 
struct v2f { 
    float4 pos : POSITION; 
    float4 color : COLOR; 
}; 

uniform float _Outline; 
uniform float4 _OutlineColor; 

v2f vert(appdata v) { 
    v2f o; 
    o.pos = mul(UNITY_MATRIX_MVP, v.vertex); 
    float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal); 
    float2 offset = TransformViewToProjection(norm.xy); 
    o.pos.xy += offset * o.pos.z * _Outline; 
    o.color = _OutlineColor; 
    return o; 
} 
ENDCG 
SubShader { 
    Tags { "RenderType"="Opaque" "Queue"="Transparent" } 
    UsePass "TFTM/Outline/Basic-Alpha/BASE" 
    Pass { 
     Name "OUTLINE" 
     Tags { "LightMode" = "Always" } 
     Cull Front 
     ZWrite On 
     ColorMask RGB 
     Blend DstColor SrcColor // 2x Multiplicative 
     CGPROGRAM 
     #pragma vertex vert 
     #pragma fragment frag 
     half4 frag(v2f i) :COLOR { return i.color ; } 
     ENDCG 
    } 
} 

SubShader { 
    Tags { "RenderType"="Opaque" "Queue"="Transparent"} 
    UsePass "TFTM/Outline/Basic-Alpha/BASE" 
    Pass { 
     Name "OUTLINE" 
     Tags { "LightMode" = "Always" } 
     Cull Front 
     ZWrite On 
     ColorMask RGB 
     Blend DstColor SrcColor // 2x Multiplicative 
     CGPROGRAM 
     #pragma vertex vert 
     #pragma exclude_renderers shaderonly 
     ENDCG 
     SetTexture [_MainTex] { combine primary } 
    } 
} 

Fallback "TFTM/Outline/Basic-Alpha" 
} 
+1

100%ではありませんが、変更ログには「Shaders:レンダーターゲットごとのブレンドモード」が記載されています。新しいシェーダーシンタックス: "Blend N Src Dst"、 "BlendOp N Op"、 "ColorMask Mask N"(Nはレンダーターゲットインデックス(0..7)です)。この機能は、DX11/12、GLCore、Metal、PS4.'で動作し、シェーダに影響する可能性があります。 –

+1

私はユニティ5.5の変更ログについて聞いたが、上記のシェーダに影響するかどうかはわからない。 –

+1

上記の引用された変更を考慮すると、ブレンドの構文変更が記述されています。そして再び、私はシェイダーの英雄ではありません。 –

答えて

0

私は、APIがOpenGL ES 3代わりのMetalにレンダリング変更することで、それを修正するが、もちろんそれは今のために一時的な修正です。

0
o.pos.xy += offset * o.pos.z * _Outline; 

o.pos.zは、プラットフォームによって異なります。 https://docs.unity3d.com/Manual/SL-PlatformDifferences.html

したがって、アウトラインの縮尺を変更することはできません。

o.pos.zの目的は、距離に関係なくアウトラインサイズを一定に保つことです。

ここで、私たちが望むのは、カメラのz軸に基づくスケール値です。

float eye_depth; 
// This depth is based on camera's z axis 
COMPUTE_EYEDEPTH(eye_depth); 
// Divided by near plane. This is similar triangle math. 
float eye_depth_scale = eye_depth/_ProjectionParams.y; 
o.pos.xy += offset * eye_depth_scale * _Outline; 

あまりにも遠すぎる場合、アウトラインのスケーリングを防ぐためにeye_depthをクランプすることができます。

+0

組み込みシェーダー変数については、こちらを参照してください。 https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html マクロをダウンロードするには、UnityShaderとUnityCG.cgincを参照してください。 –

関連する問題