2017-01-14 2 views
0

셰이더에서 특정 영역의 색을 조작해야합니다. 면적은 6 각형이며 런타임에 외부 소스에 의해 결정됩니다.셰이더에서 특정 영역의 색 변경

셰이더에서 육각형 텍스처를 사용했기 때문에 일부 셀의 색을 개별적으로 변경해야합니다.

Unity3D Wiki의 셰이더를 사용하고 있지만 셰이더에 대한 많은 경험이 없습니다.

누군가 내가 내게 기쁘다는 것을 알아낼 수있는 출처를 제공 할 수 있다면. 여기

내가 사용하고 쉐이더와 링크,

Shader "Custom/Shield" 
{ 

Properties 
{ 
    _Color("_Color", Color) = (0.0,1.0,0.0,1.0) 
    _Inside("_Inside", Range(0.0,2.0)) = 0.0 
    _Rim("_Rim", Range(0.0,1.0)) = 1.2 
    _Texture("_Texture", 2D) = "white" {} 
    _Speed("_Speed", Range(0.5,5.0)) = 0.5 
    _Tile("_Tile", Range(1.0,10.0)) = 5.0 
    _Strength("_Strength", Range(0.0,5.0)) = 1.5 
} 

SubShader 
{ 
    Tags 
    { 
     "Queue"="Transparent" 
     "IgnoreProjector"="True" 
     "RenderType"="Transparent" 

    } 


Cull Back 
ZWrite On 
ZTest LEqual 


CGPROGRAM 
#pragma surface surf BlinnPhongEditor alpha vertex:vert 
//#pragma target 3.0 


fixed4 _Color; 
sampler2D _CameraDepthTexture; 
fixed _Inside; 
fixed _Rim; 
sampler2D _Texture; 
fixed _Speed; 
fixed _Tile; 
fixed _Strength; 

struct EditorSurfaceOutput 
    { 
     half3 Albedo; 
     half3 Normal; 
     half3 Emission; 
     half3 Gloss; 
     half Specular; 
     half Alpha; 
    }; 

inline half4 LightingBlinnPhongEditor_PrePass (EditorSurfaceOutput s, half4 light) 
{ 
    half3 spec = light.a * s.Gloss; 

    half4 c; 

    c.rgb = (s.Albedo * light.rgb + light.rgb * spec); 

    c.a = s.Alpha + Luminance(spec); 

    return c; 


} 

inline half4 LightingBlinnPhongEditor (EditorSurfaceOutput s, half3 lightDir, half3 viewDir, half atten) 
{ 
    viewDir = normalize(viewDir); 
    half3 h = normalize (lightDir + viewDir); 

    half diff = max (0, dot (s.Normal, lightDir)); 

    float nh = max (0, dot (s.Normal, h)); 
    float3 spec = pow (nh, s.Specular*128.0) * s.Gloss; 

    half4 res; 
    res.rgb = _LightColor0.rgb * (diff * atten * 2.0); 
    res.w = spec * Luminance (_LightColor0.rgb); 

    return LightingBlinnPhongEditor_PrePass(s, res); 
} 

struct Input 
{ 
    float4 screenPos; 
    float3 viewDir; 
    float2 uv_Texture; 
}; 


void vert (inout appdata_full v, out Input o) 
{ 
    UNITY_INITIALIZE_OUTPUT(Input,o); 
} 


void surf (Input IN, inout EditorSurfaceOutput o) 
{ 
    o.Albedo = fixed3(0.0,0.0,0.0); 
    o.Normal = fixed3(0.0,0.0,1.0); 
    o.Emission = 0.0; 
    o.Gloss = 0.0; 
    o.Specular = 0.0; 
    o.Alpha = 1.0; 
    float4 ScreenDepthDiff0= LinearEyeDepth (tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(IN.screenPos)).r) - IN.screenPos.z; 
    float4 Saturate0=fixed4(0.3,0.3,0.3,1.0);// 
    float4 Fresnel0_1_NoInput = fixed4(0,0,1,1); 
    float dNorm = 1.0 - dot(normalize(float4(IN.viewDir, 1.0).xyz), normalize(Fresnel0_1_NoInput.xyz)); 
    float4 Fresnel0 = float4(dNorm,dNorm,dNorm,dNorm); 
    float4 Step0=step(Fresnel0,float4(1.0, 1.0, 1.0, 1.0)); 
    float4 Clamp0=clamp(Step0,_Inside.xxxx,float4(1.0, 1.0, 1.0, 1.0)); 
    float4 Pow0=pow(Fresnel0,(_Rim).xxxx); 
    float4 Multiply5=_Time * _Speed.xxxx; 
    float4 UV_Pan0=float4((IN.uv_Texture.xyxy).x,(IN.uv_Texture.xyxy).y + Multiply5.x,(IN.uv_Texture.xyxy).z,(IN.uv_Texture.xyxy).w); 
    float4 Multiply1=UV_Pan0 * _Tile.xxxx; 
    float4 Tex2D0=tex2D(_Texture,Multiply1.xy); 
    float4 Multiply2=Tex2D0 * _Strength.xxxx; 
    float4 Multiply0=Pow0 * Multiply2; 
    float4 Multiply3=Clamp0 * Multiply0; 
    float4 Multiply4=Saturate0 * Multiply3; 
    o.Emission = Multiply3.xyz * _Color.rgb; 
    o.Alpha = Multiply3.w * _Color.a; 

} 
ENDCG 
} 
Fallback "Diffuse" 
} 

http://wiki.unity3d.com/index.php/Shield

+0

unity3d 또는 OpenGL 또는 OpenGL-es 용 셰이더를 작성 하시겠습니까? – BDL

+0

유니티에서 사용 하겠지만, 다른 것들이지만 어느 것이 든 괜찮다는 것을 알았습니다. 일단 유니티가 작동하는 방식을 얻었다면 구현할 수 있습니다. – Sangratura

답변

0

쉐이더 프로그램이 실제로 더 많은 매개 변수를 가질 수있는 설정된다 (행렬, 벡터와 수레 등) 재질에서 런타임시 코드에서 제외되지만 속성 블록의 일부가 아닌 경우 해당 값은 저장되지 않습니다. 이것은 대부분 스크립트 코드로 구동되는 값 (Material.SetFloat 및 유사한 함수 사용)에 유용합니다.

출처 : https://docs.unity3d.com/Manual/SL-Properties.html

그것은 당신이 다른 색상으로 독특한 재료를 사용할 필요가 사용할 것으로 보인다. 그런 다음 Material.SetColor()를 사용하여 재료 색상을 동적으로 조정할 수 있습니다.

+0

유니티 부분을 처리하는 방법을 알고 있습니다. 셰이더 자체를 조작하고 단일 재질의 특정 영역에서 색상을 변경하는 방법을 알아야합니다. – Sangratura