unity3d 发光效果_unity 3d 制作物体发光的效果 - CSDN
  • Unity3D 发光Shader

    千次阅读 2017-03-08 13:52:58
    Shader "Custom/LightShader" {  Properties {  _RimColor ("Rim Color", Color) = (1,1,1,0.5)  _InnerColor ("Inner Color", Color) = (1,1,1,0.5)  _InnerColorPower ("Inner Colo
    Shader "Custom/LightShader" 
    {
        Properties {
            _RimColor ("Rim Color", Color) = (1,1,1,0.5)
            _InnerColor ("Inner Color", Color) = (1,1,1,0.5)
            _InnerColorPower ("Inner Color Power", Range(0.0,1.0)) = 0.5
            _RimPower ("Rim Power", Range(0.0,5.0)) = 2.5
            _AlphaPower ("Alpha Rim Power", Range(0.0,8.0)) = 4.0
            _AllPower ("All Power", Range(0.0, 10.0)) = 1.0
        }
        SubShader {
            Tags { "Queue" = "Transparent" }

            CGPROGRAM
            #pragma surface surf Lambert alpha
            struct Input {
            float3 viewDir;
            INTERNAL_DATA
            };
            float4 _RimColor;
            float _RimPower;
            float _AlphaPower;
            //float _AlphaMin;
            float _InnerColorPower;
            float _AllPower;
            float4 _InnerColor;
            void surf (Input IN, inout SurfaceOutput o) {
            half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
            o.Emission = _RimColor.rgb * pow (rim, _RimPower)*_AllPower+(_InnerColor.rgb*2*_InnerColorPower);
            o.Alpha = (pow (rim, _AlphaPower))*_AllPower;
            }
            ENDCG
        }
        Fallback "VertexLit"

    }

    效果

    展开全文
  • UnityShader 3D模型边缘发光效果

    千次阅读 2018-08-10 12:21:38
    当我们在玩部分游戏的时候会发现,有些游戏的模型的边缘会有泛光效果,这种效果顿时给人一种高大上的感觉,今天就用shader来实现一个边缘泛光的效果。 原理 当我们的摄像机面正向面对物体的时候,模型的法线越...

    当我们在玩部分游戏的时候会发现,有些游戏的模型的边缘会有泛光效果,这种效果顿时给人一种高大上的感觉,今天就用shader来实现一个边缘泛光的效果。

    原理

    当我们的摄像机面正向面对物体的时候,模型的法线越平行于于摄像机的视线方向的时候那么夹角就越小,越是边缘的地方夹角越接近90度,所以我们可以用视线的方向和模型法线的方向进行点乘,越是边缘点乘结果越接近0。

    Shader "MyShader/RimShader"
    {
    	Properties
    	{
    		_MainTex ("Texture", 2D) = "white" {}
    		_Diffuse("Diffuse", Color) = (1,1,1,1)
    		_RimColor("Rim Color", Color) = (1,1,1,1)
    		_RimPower("Rim Power", Range(0.0, 10)) = 0.3
    		_RimIntensity("Rim Intensity", Range(0.0, 50)) = 3
    	}
    	SubShader
    	{
    		Tags { "RenderType"="Opaque" }
    
    		Pass
    		{
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			
    			#include "UnityCG.cginc"
    			#include "Lighting.cginc"
    
    			struct appdata
    			{
    				float4 vertex : POSITION;
    				float2 uv : TEXCOORD0;
    				float3 normal:NORMAL;
    			};
    
    			struct v2f
    			{
    				float2 uv : TEXCOORD0;
    				float4 vertex : SV_POSITION;
    				float3 worldNormal : NORMAL;
    				float4 worldPos : TEXCOORD1;
    			};
    			
    			sampler2D _MainTex;
    			float4 _MainTex_ST;
    			fixed4 _Diffuse;
    			float4 _RimColor;
    			float _RimPower;
    			float _RimIntensity;
    
    			
    			v2f vert (appdata v)
    			{
    				v2f o;
    				float4 worldPos;
    
    				o.vertex = UnityObjectToClipPos(v.vertex);
    				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    
    				//转化为世界空间下的顶点坐标
    				o.worldPos = mul(unity_ObjectToWorld, v.vertex);
    				//转化为世界空间下的法线向量
    				o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);
    
    				return o;
    			}
    			
    			fixed4 frag (v2f i) : SV_Target
    			{
    
    			//----------------半兰伯特模型---------------------------------------
    
    			fixed4 color = tex2D(_MainTex, i.uv);
    			
    			//归一化世界法线
    			fixed3 worldNormal = normalize(i.worldNormal);
    			//光照方向归一化
    			fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
    
    			//环境光计算
    			fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _Diffuse.xyz;
    			
    			//半兰伯特模型计算公式
    			fixed halfLambert = dot(worldNormal, worldLightDir)*0.5 + 0.5;
    
    			//最终漫反射结果
    			fixed3 diffuse = _LightColor0.xyz*_Diffuse.xyz*halfLambert + ambient;
    						
    			//----------------边缘光计算----------------------------------------
    
    			//获取摄像机世界空间下的视角的方向,并归一化
    			float3 worldViewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);
    			
    			//通过点乘来判断该点位置是否在边缘,越是边缘夹角越接近90度
    			float rim = 1 - max(0, dot(worldViewDir, worldNormal));
    
    			//计算边缘光
    			fixed3 rimColor = _RimColor * pow(rim, 1 / _RimPower)*_RimIntensity;
    			
    			//最终光照结果
    			fixed3  finalColor = color.rgb* diffuse + rimColor;
    
    			return fixed4(finalColor,1);
    			}
    			ENDCG
    		}
    	}
    	FallBack "Diffuse"
    }
    

    最终效果

    展开全文
  • Unity角色受击身体边缘发光特效实现

    千次阅读 2019-07-10 15:41:43
    游戏中经常需要制作角色受击打的身体边缘光效果,本文使用的方法是,给Renderer叠加一个制作好的边缘光材质球,并通过脚本动态控制边缘光的渐变效果,表现出受击后的边缘光效果 工程结构如下 1 创建一个材质球...

    游戏中经常需要制作角色受击打的身体边缘光效果,本文使用的方法是,给Renderer叠加一个制作好的边缘光材质球,并通过脚本动态控制边缘光的渐变效果,表现出受击后的边缘光效果

    工程结构如下
    1 创建一个材质球HittedMatEffect.mat放在Assets/Resources/Material目录中,使用TransparentRim.shader
    注意代码中用了Resources.Load,所以必须放在这个目录里,你可以改成别的方式
    2 场景中创建一个Sphere(球体),挂上Runner脚本,运行,点击屏幕任意位置,球体就会表现出受击的边缘光效果了
    在这里插入图片描述
    运行效果
    在这里插入图片描述


    代码

    TransparentRim.shader

    Shader "Effect/TransparentRim" {
    	Properties{
    
    
    	_RimColor("Rim Color", Color) = (0.5,0.5,0.5,0.5)
    	_InnerColor("Inner Color", Color) = (0.5,0.5,0.5,0.5)
    	_InnerColorPower("Inner Color Power", Range(0.0,1.0)) = 0.5
    	_RimPower("Rim Power", Range(0.0,5.0)) = 2.5
    	_AlphaPower("Alpha Rim Power", Range(0.0,8.0)) = 4.0
    	_AllPower("All Power", Range(0.0, 10.0)) = 1.0
    
    
    	}
    		SubShader{
    		Tags { "Queue" = "Transparent" }
    
    		CGPROGRAM
    		#pragma surface surf Lambert alpha
    		struct Input {
    		float3 viewDir;
    		INTERNAL_DATA
    		};
    		float4 _RimColor;
    		float _RimPower;
    		float _AlphaPower;
    		float _AlphaMin;
    		float _InnerColorPower;
    		float _AllPower;
    		float4 _InnerColor;
    		void surf(Input IN, inout SurfaceOutput o) {
    			half rim = 1.0 - saturate(dot(normalize(IN.viewDir), o.Normal));
    			o.Emission = _RimColor.rgb * pow(rim, _RimPower)*_AllPower + (_InnerColor.rgb * 2 * _InnerColorPower);
    			o.Alpha = (pow(rim, _AlphaPower))*_AllPower;
    		}
    		ENDCG
    	}
    		Fallback "VertexLit"
    }
    

    HittedMatEffect.cs

    // HittedMatEffect.cs
    using UnityEngine;
    using System.Collections;
    
    public class HittedMatEffect : MonoBehaviour
    {
        bool mbActive = false;
        bool mbInit = false;
        Material mMat = null;
        public float mLife;
        private static int s_InnerColor = -1;
        private static int s_AllPower = -1;
        private static int s_AlphaPower = -1;
    
        void Awake()
        {
            s_InnerColor = Shader.PropertyToID("_InnerColor");
            s_AllPower = Shader.PropertyToID("_AllPower");
            s_AlphaPower = Shader.PropertyToID("_AlphaPower");
        }
    
        // Use this for initialization
        /// <summary>
        /// 设置材质颜色
        /// </summary>
        /// <param name="color"></param>
        public void SetColor(Color color)
        {
            mMat.SetColor(s_InnerColor, color);
    
        }
        
        public void SetLifeTime(float time)
        {
            mLife = time;
        }
        
        public void Active()
        {
            if (!mbInit)
                AddEffect();
            mMat.SetFloat(s_AllPower, 0.9f);
            mbActive = true;
            mLife = 0.2f;
    
        }
    
        void Update()
        {
            if (!mbActive)
                return;
            mLife -= Time.deltaTime;
            if (mLife < 0)
            {
                mbActive = false;
                mMat.SetFloat(s_AllPower, 0);
            }
            float v = Mathf.Sin((1 - mLife) * 8 * Mathf.PI) + 2;
            mMat.SetFloat(s_AlphaPower, v);
        }
    
        void AddEffect()
        {
            Object mat = Resources.Load("Material/HittedMatEffect");
            mMat = GameObject.Instantiate(mat) as Material;
            foreach (var curMeshRender in transform.GetComponentsInChildren<Renderer>())
            {
                Material[] newMaterialArray = new Material[curMeshRender.materials.Length + 1];
                for (int i = 0; i < curMeshRender.materials.Length; i++)
                {
                    if (curMeshRender.materials[i].name.Contains("HittedMatEffect"))
                    {
                        return;
                    }
                    else
                    {
                        newMaterialArray[i] = curMeshRender.materials[i];
                    }
                }
                if (null != mMat)
                    newMaterialArray[curMeshRender.materials.Length] = mMat;
                curMeshRender.materials = newMaterialArray;
            }
            mbInit = true;
        }
    
        void RemoveEffect()
        {
            foreach (var curMeshRender in transform.GetComponentsInChildren<Renderer>())
            {
                int newMaterialArrayCount = 0;
                for (int i = 0; i < curMeshRender.materials.Length; i++)
                {
                    if (curMeshRender.materials[i].name.Contains("HittedMatEffect"))
                    {
                        newMaterialArrayCount++;
                    }
                }
    
                if (newMaterialArrayCount > 0)
                {
                    Material[] newMaterialArray = new Material[newMaterialArrayCount];
                    int curMaterialIndex = 0;
                    for (int i = 0; i < curMeshRender.materials.Length; i++)
                    {
                        if (curMaterialIndex >= newMaterialArrayCount)
                        {
                            break;
                        }
                        if (!curMeshRender.materials[i].name.Contains("HittedMatEffect"))
                        {
                            newMaterialArray[curMaterialIndex] = curMeshRender.materials[i];
                            curMaterialIndex++;
                        }
                    }
                    curMeshRender.materials = newMaterialArray;
                }
    
            }
        }
    }
    

    Runner.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Runner : MonoBehaviour
    {
        // Use this for initialization
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                HittedMatEffect sc = gameObject.GetComponent<HittedMatEffect>();
                if (null == sc)
                    sc = gameObject.AddComponent<HittedMatEffect>();
                sc.Active();
                sc.SetColor(Color.red);
            }
        }
    }
    
    展开全文
  • 1.新建工程,在Asset Store下载...3.通过步骤2发现,只要高亮度的物体都有自发光效果,包括天空盒子。有一种初略的过略方式:新建Shader,新建Material,将Shader附在材质上,通过调节Material的Intensity和Blo...

    1.新建工程,在Asset Store下载Legacy Image Effects,导入工程。
    2.在Camera上加上Bloom脚本。调节Bloom参数就可以看到自发光(荧光效果)了。

    3.通过步骤2发现,只要高亮度的物体都有自发光效果,包括天空盒子。有一种初略的过略方式:新建Shader,新建Material,将Shader附在材质上,通过调节Material的Intensity和Bloom上的Threshold实现过滤,这种过滤方式比较粗,要更细致的过滤方式需要自己进一步开发。

    // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
    
    Shader "Glow" {
        Properties {
            _MainTex ("Texture", 2D) = "white" {}
            _Color ("Color", Color) = (1,1,1,1)
            _Glow ("Intensity", Range(0, 3)) = 1
        }
        SubShader {
            Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
            LOD 100
            Cull Off
            ZWrite On
            Blend SrcAlpha OneMinusSrcAlpha
    
            Pass {
                CGPROGRAM
                    #pragma vertex vert
                    #pragma fragment frag
    
                    sampler2D _MainTex;
                    half4 _MainTex_ST;
                    fixed4 _Color;
                    half _Glow;
    
                    struct vertIn {
                        float4 pos : POSITION;
                        half2 tex : TEXCOORD0;
                    };
    
                    struct v2f {
                        float4 pos : SV_POSITION;
                        half2 tex : TEXCOORD0;
                    };
    
                    v2f vert (vertIn v) {
                        v2f o;
                        o.pos = UnityObjectToClipPos(v.pos);
                        o.tex = v.tex * _MainTex_ST.xy + _MainTex_ST.zw;
                        return o;
                    }
    
                    fixed4 frag (v2f f) : SV_Target {
                        fixed4 col = tex2D(_MainTex, f.tex);
                        col *= _Color;
                        col *= _Glow;
                        return col;
                    }
                ENDCG
            }
        }
    }

     

    展开全文
  • unity3d边缘发光效果

    千次阅读 2015-07-21 17:56:17
    这是本人在学习unity的shader的一些理解,效果图如下 核心代码为 void surf (Input IN, inout SurfaceOutput o) { fixed4 t = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = t.rgb; o.Alpha = t.a; half ...
  • unity自带的image effect中的一个摄像机特效,针对全屏幕渲染的。场景中的GameObject的材质shader通过alpha通道进行控制光晕,也就是说当alpha变成0那么将是原来的颜色。
  • Unity3D】物体发光插件

    千次阅读 2019-05-20 15:02:37
    本篇文章讲的是如何让3D物体放光的方法 二、效果 三、实现 这个是一个插件,但是主要就是这两个脚本 HighlightableObject.cs HighlightingEffect.cs 其他的先不做讨论 HighlightableObject.cs脚本 using ...
  • Unity3D - 发光材质(Emissive Materials)

    万次阅读 2017-08-11 23:07:23
    Emissive Materials
  • ## Unity3D实现粒子光环效果

    千次阅读 2016-06-05 16:38:31
    Unity3D实现粒子光环效果参考效果: http://i-remember.fr/en
  • 最近在做一个项目,了解到了一个Unity的插件——HighlightingSystem HighlightingSystem 链接:https://pan.baidu.com/s/1SoOwz7c8Ai1lZE93nzDSTw 提取码:v9p6 关于插件,导入之后可能会又报错,将报错...
  • Unity添加自发光材质

    千次阅读 2017-09-19 15:33:35
    我们很多时候希望模型有自发光材质,这样就不需要灯光了,设置方法是将模型用到的材质shader修改为: 自发光的shader有很多,也可以自己写喽。
  • Shader "Custom/AlphaSelfIllum" { Properties { _Color ("Main Color", Color) = (1,1,1,0) _SpecColor ("Spec Color", Color) = (1,1,1,1) _Emission ("Emmisive Color", Color) = (0,0,0...
  • Unity之自发光Emission效果

    万次阅读 2017-04-24 20:39:04
    小白欢迎评论,共同探讨,共同进步  写的博文零碎可能比较多,... Unity之自发光Emission效果  很多人都会奇怪,为什么我选了自发光的颜色,强度也调整的很大,为什么出不来效果呢,其实可能是少了一步操作
  • 使用Unity3d做了一个室内设计的应用,但是专业人士说效果不行,这个我看了其他人的一些Unity3d室内 设计的应用,效果很赞。发现我这个的效果确实很有差距。在这个场景里面我用了Unity3d自带的Shader: 1.大部分都...
  • Indie Glow 物体光晕特效unity3d插件模型UNITY3D游戏特效pro
  • Unity3d-粒子光环特效

    千次阅读 2018-05-29 17:17:55
    当鼠标hover到图一中间的+号圆圈中间时,光环会收缩成图二的状态,具体效果可自行前往网站体验~ 我们需要模仿这个效果并尝试用粒子流编程控制来实现。 实现 光环在收缩前较为分散,位于光环中间的部分粒子较...
  • unity文本自发光效果

    万次阅读 2016-03-16 15:04:52
    项目要求一个文本自发光效果,网上搜索了一下法线并没有找到有关代码,于是只能自己动手写了一个,先上效果吧 这里其实只用到了简单的模糊效果,本来想用的高斯模糊,但是发现效果还不如简单的模糊效果。下面是片...
  • Unity中利用材质自发光实现物体闪烁效果

    万次阅读 热门讨论 2018-07-09 19:34:47
    Unity中利用材质自发光实现物体闪烁效果 看到别的游戏里有物体高亮闪烁效果,但自己不会写Shader,就只想到用材质自发光来做一下,不知道有没有更好的办法! 原理比较简单,通过代码开启材质的自发光效果,然后...
  • 放到工程文件夹里面,让物体(gameObject)的材质(material)添加这个shader,就行。
  • 大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei。 在《仙剑奇侠传》、《古剑奇谭》等游戏中...那么,这一功能如何在Unity3D中实现呢?首先我们可以将问题分解为两个子问题:第一
1 2 3 4 5 ... 20
收藏数 1,777
精华内容 710
关键字:

unity3d 发光效果