2016-12-09 4 views
1

Шейдер работает нормально на уровне 5.4 на iPad Air, но после обновления до единицы 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 прохода, первый дро над шейдера, а затем сделать наброски и отбраковки фронт.

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: Per-rendertarget blend modes. Новый синтаксис шейдера: «Blend N Src Dst», «BlendOp N Op», «ColorMask Mask N», где N - целевой показатель рендеринга (0..7). Эта функция работает на DX11/12, GLCore, Metal, PS4.', которые могут повлиять на шейдер. –

+1

ya я слышал о единстве 5.5 журнала изменений, но после прохождения я не знаю, влияет ли это на шейдер выше. –

+1

Учитывая приведенное выше изменение, упоминается изменение синтаксиса для blend, которое вы, кажется, используете несколько раз, я бы предположил, что это так. Опять же, я не герой в шейдерах. –

ответ

0

исправить это путем изменения апи воздавать 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 –

Смежные вопросы