美术相关 会shader的来

4
回复
1506
查看
打印 上一主题 下一主题
[ 复制链接 ]
5熟悉之中
881/1000
排名
4149
昨日变化

14

主题

248

帖子

881

积分

Rank: 5Rank: 5

UID
231366
好友
9
蛮牛币
1833
威望
0
注册时间
2017-7-10
在线时间
263 小时
最后登录
2019-7-27
5蛮牛币
Shader "Custom/Shadow" {
        Properties{
          _MainTex("Main Tex", 2D) = "white" {}
           _AlphaTex("AlphaTex",2D) = "white"{}
          _Offset("Offset", vector) = (0, 0, 0, 0)
        }
                CGINCLUDE
#include "UnityCG.cginc"
                  sampler2D _MainTex;
          float4 _Offset;
          sampler2D _AlphaTex;
          float4 _MainTex_ST;

          struct v2f {
                  float4 pos : POSITION;
                  float2 uv : TEXCOORD0;
          };

          v2f vert_normal(appdata_base v) {
                  v2f o;
                  o.pos = UnityObjectToClipPos(v.vertex);
                  o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                  return o;
          }

          v2f vert_offset(appdata_base v) {
                  v2f o;
                  float4 pos = mul(unity_ObjectToWorld, v.vertex);
                  o.pos = mul(UNITY_MATRIX_VP, pos + _Offset);
                  o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                  return o;
          }

          float4 frag_normal(v2f i) : COLOR
          {
                float4 texcol = tex2D(_MainTex, i.uv);
                texcol.w = tex2D(_AlphaTex,i.uv)*texcol.w;
                return texcol;
          }

                  float4 frag_color(v2f i) : COLOR
                  {
                        float4 c;
                        c = tex2D(_MainTex, i.uv);
                        c.w = tex2D(_AlphaTex,i.uv)*c.w;
                        if (c.w >= 0.5)
                        {
                           c.r = 0;
                           c.g = 0;
                           c.b = 0;
                           c.w = 0.5f;
                        }

                        return c;
             }




                  ENDCG
                  SubShader {
                  Tags{ "Queue" = "Transparent" }
                          Pass{
                                ZWrite Off
                                Blend SrcAlpha OneMinusSrcAlpha
                                CGPROGRAM
                                #pragma vertex vert_offset
                                #pragma fragment frag_color
                                ENDCG
                  }
                          Pass{
                          ZWrite Off
                                Blend SrcAlpha OneMinusSrcAlpha
                                CGPROGRAM
                                #pragma vertex vert_normal
                                #pragma fragment frag_normal
                                ENDCG
                  }
          }
          FallBack "Diffuse"
}


谁能帮我在上面的shader里加一个主材质变红的代码 可以有c#调用?

点评

发表于 2019-1-25 09:35
4四处流浪
423/500
排名
8012
昨日变化

5

主题

93

帖子

423

积分

Rank: 4

UID
135780
好友
1
蛮牛币
616
威望
0
注册时间
2016-1-28
在线时间
167 小时
最后登录
2019-7-9
沙发
2019-1-24 17:08:53 只看该作者
这样?
Shader "Custom/Shadow"
{
        Properties
        {
                _MainTex("Main Tex", 2D) = "white" {}
                _AlphaTex("AlphaTex",2D) = "white"{}
                _Offset("Offset", vector) = (0, 0, 0, 0)
                _ShadowColor("ShadowColor",color)=(0,0,0,0)
                _MainColor("MainColor",color)=(0,0,0,0)
        }
                CGINCLUDE
#include "UnityCG.cginc"
        sampler2D _MainTex;
        float4 _Offset;
        sampler2D _AlphaTex;
        float4 _MainTex_ST;
        fixed4 _MainColor;
        fixed4 _ShadowColor;

        struct v2f {
                float4 pos : POSITION;
                float2 uv : TEXCOORD0;
        };

        v2f vert_normal(appdata_base v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                return o;
        }

        v2f vert_offset(appdata_base v) {
                v2f o;
                float4 pos = mul(unity_ObjectToWorld, v.vertex);
                o.pos = mul(UNITY_MATRIX_VP, pos + _Offset);
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                return o;
        }

        float4 frag_normal(v2f i) : COLOR
        {
                float4 texcol = tex2D(_MainTex, i.uv);
                texcol += fixed4((fixed3)_MainColor,0);
                texcol.w = tex2D(_AlphaTex,i.uv)*texcol.w;
                return texcol;
        }

                float4 frag_color(v2f i) : COLOR
        {
                float4 c;
                c = tex2D(_MainTex, i.uv);
                c += fixed4((fixed3)_ShadowColor,0);
                c.w = tex2D(_AlphaTex,i.uv)*c.w;
                if (c.w >= 0.5)
                {
                        c.r = 0;
                        c.g = 0;
                        c.b = 0;
                        c.w = 0.5f;
                }
               

        return c;
        }

                ENDCG
                SubShader {
                Tags{ "Queue" = "Transparent" }
                        Pass{
                        ZWrite Off
                        Blend SrcAlpha OneMinusSrcAlpha
                        CGPROGRAM
#pragma vertex vert_offset
#pragma fragment frag_color
                        ENDCG
                }
                        Pass{
                        ZWrite Off
                        Blend SrcAlpha OneMinusSrcAlpha
                        CGPROGRAM
#pragma vertex vert_normal
#pragma fragment frag_normal
                        ENDCG
                }
        }
        FallBack "Diffuse"
}

排名
39862
昨日变化

1

主题

16

帖子

64

积分

Rank: 2Rank: 2

UID
4477
好友
0
蛮牛币
19
威望
0
注册时间
2013-9-24
在线时间
41 小时
最后登录
2019-3-29
板凳
2019-1-28 14:01:30 只看该作者
[C#] 纯文本查看 复制代码
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEngine;

public abstract class QKShaderEditorBase : ShaderGUI
{
    public class FeatureToggle
    {
        //在属性面板中名称
        public string m_strInspectorName;

        //决定当Enabled false 是否不显示 主要是匹配InspectorName
        public string m_strInspectorPropertyHideTag;

        //开启关键字
        public string m_strShaderKeywordEnabled;

        //关闭关键字 如果不生成关键字项参数为 ""
        public string m_strShaderKeywordDisabled;

        //是否启用
        public bool m_bEnabled;

        public FeatureToggle(string InspectorName, string InspectorPropertyHideTag, string ShaderKeywordEnabled, string ShaderKeywordDisabled)
        {
            m_strInspectorName = InspectorName;
            m_strInspectorPropertyHideTag = InspectorPropertyHideTag;
            m_strShaderKeywordEnabled = ShaderKeywordEnabled;
            m_strShaderKeywordDisabled = ShaderKeywordDisabled;
            m_bEnabled = false;
        }
    }

    protected List<FeatureToggle> Toggles = new List<FeatureToggle>();
    protected abstract void CreateToggleList();

    override public void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
    {
        //展开时重绘
        if (!materialEditor.isVisible)
            return;

        Material targetMat = materialEditor.target as Material;
        string[] oldKeyWords = targetMat.shaderKeywords;
        Toggles = new List<FeatureToggle>();
        CreateToggleList();

        for (int i = 0; i < Toggles.Count; i++)
        {
            Toggles.m_bEnabled = oldKeyWords.Contains(Toggles.m_strShaderKeywordEnabled);
        }
        EditorGUI.BeginChangeCheck();
        float controlSize = 64;
        EditorGUIUtility.labelWidth = Screen.width - controlSize - 20;
        EditorGUIUtility.fieldWidth = controlSize;

        Shader shader = targetMat.shader;
        EditorGUI.BeginChangeCheck();

        for (int i = 0; i < ShaderUtil.GetPropertyCount(shader); i++)
        {
            ShaderPropertyImpl(shader, i, null, materialEditor, properties);
        }
        for (int s = 0; s < Toggles.Count; s++)
        {
            EditorGUILayout.Separator();
            Toggles.m_bEnabled = EditorGUILayout.BeginToggleGroup(Toggles.m_strInspectorName, Toggles.m_bEnabled);

            if (Toggles.m_bEnabled)
            {
                for (int i = 0; i < ShaderUtil.GetPropertyCount(shader); i++)
                {
                    ShaderPropertyImpl(shader, i, Toggles, materialEditor, properties);
                }
            }
            EditorGUILayout.EndToggleGroup();
        }

        if (EditorGUI.EndChangeCheck())
            materialEditor.PropertiesChanged();
        

        if (EditorGUI.EndChangeCheck())
        {
            List<string> newKeyWords = new List<string>();
            for (int i = 0; i < Toggles.Count; i++)
            {
                if(!string.IsNullOrEmpty(Toggles.m_strShaderKeywordDisabled))
                {
                    newKeyWords.Add(Toggles.m_bEnabled ? Toggles.m_strShaderKeywordEnabled : Toggles.m_strShaderKeywordDisabled);
                }
                else
                {
                    if(Toggles.m_bEnabled)
                    {
                        newKeyWords.Add(Toggles.m_strShaderKeywordEnabled);
                    }
                }
               
            }
            targetMat.shaderKeywords = newKeyWords.ToArray();
            EditorUtility.SetDirty(targetMat);
        }
    }

    private void ShaderPropertyImpl(Shader shader, int propertyIndex, FeatureToggle currentToggle, MaterialEditor materialEditor, MaterialProperty properties)
    {
        string propertyDescription = ShaderUtil.GetPropertyDescription(shader, propertyIndex);
        if (currentToggle == null)
        {
            for (int i = 0; i < Toggles.Count; i++)
            {
                if (Regex.IsMatch(propertyDescription, Toggles.m_strInspectorPropertyHideTag, RegexOptions.IgnoreCase))
                {
                    return;
                }
            }
        }
        else if (!Regex.IsMatch(propertyDescription, currentToggle.m_strInspectorPropertyHideTag, RegexOptions.IgnoreCase))
        {
            return;
        }
        materialEditor.ShaderProperty(properties, properties.displayName);
    }
}



楼主自己实现下子类CreateToggleList
排名
39862
昨日变化

1

主题

16

帖子

64

积分

Rank: 2Rank: 2

UID
4477
好友
0
蛮牛币
19
威望
0
注册时间
2013-9-24
在线时间
41 小时
最后登录
2019-3-29
地板
2019-1-28 14:23:35 只看该作者
不好意思,我上面没说完整,这里再补充一下。shader中需要类似于这样申明外部属性:[MaterialToggle] _HitColorToggle ("HitColorToggle", Float) = 0,然后在c#脚本中这样设置属性值:
[C#] 纯文本查看 复制代码
 public virtual bool enableHitColor
    {
        set
        {
            if(null != matPropertyBlock)
            {
                if (value)
                {
                    matPropertyBlock.SetFloat(StringArrayExtend.HitColorID, 1);
                }
                else
                {
                    matPropertyBlock.SetFloat(StringArrayExtend.HitColorID, 0);
                }
                _renderer.SetPropertyBlock(matPropertyBlock);
            }

        }
    }
您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则