代码之家  ›  专栏  ›  技术社区  ›  blue

Unity shader/c-如何更改效果的颜色?

  •  2
  • blue  · 技术社区  · 6 年前

    好的,所以我使用这个带有颜色“漂移”的故障效应(模拟效应)。

    https://github.com/keijiro/KinoGlitch

    它附带了一个明暗器和这个模拟故障脚本(全部链接):

     [ExecuteInEditMode]
        [RequireComponent(typeof(Camera))]
        [AddComponentMenu("Kino Image Effects/Analog Glitch")]
        public class AnalogGlitch : MonoBehaviour
        {
            #region Public Properties
    
            // Scan line jitter
    
            [SerializeField, Range(0, 1)]
            float _scanLineJitter = 0;
    
            public float scanLineJitter {
                get { return _scanLineJitter; }
                set { _scanLineJitter = value; }
            }
    
            // Vertical jump
    
            [SerializeField, Range(0, 1)]
            float _verticalJump = 0;
    
            public float verticalJump {
                get { return _verticalJump; }
                set { _verticalJump = value; }
            }
    
            // Horizontal shake
    
            [SerializeField, Range(0, 1)]
            float _horizontalShake = 0;
    
            public float horizontalShake {
                get { return _horizontalShake; }
                set { _horizontalShake = value; }
            }
    
            // Color drift
    
            [SerializeField, Range(0, 1)]
            float _colorDrift = 0;
    
            public float colorDrift {
                get { return _colorDrift; }
                set { _colorDrift = value; }
            }
    
            #endregion
    
            #region Private Properties
    
            [SerializeField] Shader _shader;
    
            Material _material;
    
            float _verticalJumpTime;
    
            #endregion
    
            #region MonoBehaviour Functions
    
            void OnRenderImage(RenderTexture source, RenderTexture destination)
            {
                if (_material == null)
                {
                    _material = new Material(_shader);
                    _material.hideFlags = HideFlags.DontSave;
                }
    
                _verticalJumpTime += Time.deltaTime * _verticalJump * 11.3f;
    
                var sl_thresh = Mathf.Clamp01(1.0f - _scanLineJitter * 1.2f);
                var sl_disp = 0.002f + Mathf.Pow(_scanLineJitter, 3) * 0.05f;
                _material.SetVector("_ScanLineJitter", new Vector2(sl_disp, sl_thresh));
    
                var vj = new Vector2(_verticalJump, _verticalJumpTime);
                _material.SetVector("_VerticalJump", vj);
    
                _material.SetFloat("_HorizontalShake", _horizontalShake * 0.2f);
    
                var cd = new Vector2(_colorDrift * 0.04f, Time.time * 606.11f);
                _material.SetVector("_ColorDrift", cd);
    
                Graphics.Blit(source, destination, _material);
            }
    
            #endregion
    

    我需要找出如何改变它“小故障”的颜色-正如你现在看到的,它小故障绿色和洋红。我需要红色和蓝色,但找不到具体的颜色值。

    我可以根据需要发布明暗器-我如何才能实现这个小故障,但在统一的红色/蓝色?

    明暗器:

    Shader "Hidden/Kino/Glitch/Analog"
    {
        Properties
        {
            _MainTex ("-", 2D) = "" {}
        }
        CGINCLUDE
    
        #include "UnityCG.cginc"
    
        sampler2D _MainTex;
        float2 _MainTex_TexelSize;
    
        float2 _ScanLineJitter; // (displacement, threshold)
        float2 _VerticalJump;   // (amount, time)
        float _HorizontalShake;
        float2 _ColorDrift;     // (amount, time)
    
        float nrand(float x, float y)
        {
            return frac(sin(dot(float2(x, y), float2(12.9898, 78.233))) * 43758.5453);
        }
    
        half4 frag(v2f_img i) : SV_Target
        {
            float u = i.uv.x;
            float v = i.uv.y;
    
            // Scan line jitter
            float jitter = nrand(v, _Time.x) * 2 - 1;
            jitter *= step(_ScanLineJitter.y, abs(jitter)) * _ScanLineJitter.x;
    
            // Vertical jump
            float jump = lerp(v, frac(v + _VerticalJump.y), _VerticalJump.x);
    
            // Horizontal shake
            float shake = (nrand(_Time.x, 2) - 0.5) * _HorizontalShake;
    
            // Color drift
            float drift = sin(jump + _ColorDrift.y) * _ColorDrift.x;
    
            half4 src1 = tex2D(_MainTex, frac(float2(u + jitter + shake, jump)));
            half4 src2 = tex2D(_MainTex, frac(float2(u + jitter + shake + drift, jump)));
    
            return half4(src1.r, src2.g, src1.b, 1);
        }
    
        ENDCG
        SubShader
        {
            Pass
            {
                ZTest Always Cull Off ZWrite Off
                CGPROGRAM
                #pragma vertex vert_img
                #pragma fragment frag
                #pragma target 3.0
                ENDCG
            }
        }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Draco18s no longer trusts SE    6 年前

    _ColorDrift 用于在名为 drift ,然后该值仅用于一个位置以生成 src2 纹理。

    然后使用一次这种纹理, return half4(src1.r, src2.g, src1.b, 1);

    注意到 SRC2型 纹理只提供其绿色值。这意味着绿色通道被偏移(产生绿色和反绿色(洋红)失真)。

    你可以调整这个 return 线条生成红色/反红色(青色)变形或蓝色/反蓝色(黄色)变形。只需改变哪个颜色值 SRC2型 变量应用于。

    红色/青色:
    return half4(src2.r, src1.g, src1.b, 1);

    蓝色/黄色:
    return half4(src1.r, src1.g, src2.b, 1);

    注意应用 SRC2型 在颜色通道中,只会触发失真(红色/反红色->反红色/红色),使其更强烈(纹理跳跃的明显距离更大)。