使用UnityShader实现外发光效果

使用UnityShader实现外发光效果


实现原理------------------------------------------------------------------------------------
法线和视角向量的点积值为 Cos(angle), 夹角越大,值越小;
Color * (1- Cos(angle))可以模拟边缘亮内部暗的现象;
Color * (1- Cos(angle))^power, 使用指数控制边缘光的范围;

效果展示-------------------------------------------------------------------------------------------------------
在这里插入图片描述

Shader "zclShader/边缘光Shader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
		//控制外发光的颜色
		_RimColor("_RimColor",Color) = (0,0,1,0)
		//控制外发光的范围
		_RimPower("_RimPower",Range(1,10)) = 1
		//控制外发光的强度
		_RimStrength("_RimStrength",Range(1,10)) = 4
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
          

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
				float3 normal:NORMAL;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
             
                float4 vertex : SV_POSITION;
				float3 normal:NORMAL;
				float3 m_viewDir:TEXCOORD1;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
			float4 _RimColor;
			float _RimStrength;
			float _RimPower;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				o.normal = v.normal;
				o.m_viewDir = ObjSpaceViewDir(v.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
				float3 normal = normalize(i.normal);
				float3 m_viewDir= normalize(i.m_viewDir);

				float Rim = 1 - saturate(dot(normal, m_viewDir));  
				Rim = pow(Rim,_RimPower);
				float4 addColor = Rim * _RimColor *_RimStrength;

                fixed4 col = tex2D(_MainTex, i.uv);
				col += addColor;
                return col;
            }
            ENDCG
        }
    }
}

使用纹理贴图实现外发光

 v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex);   
				//法线的投影在 (-1,1)之间
				//放在顶点shader里面计算,模型缩放影响外发光的表现
				o.uv.zw = mul(UNITY_MATRIX_MV, v.normal).xy * 0.5 + 0.5;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {             
                fixed4 col = tex2D(_MainTex, i.uv.xy);
				fixed4 RimColor = tex2D(_RimTex, i.uv.zw);  //对发光纹理采样
                return col + RimColor*fixed4(1,0,0,1);
            }

在片元中计算

  fixed4 frag (v2f i) : SV_Target
            {      
                float2 rimUV = mul(UNITY_MATRIX_MV, normalize(i.normal)).xy * 0.5 + 0.5;  
                fixed4 col = tex2D(_MainTex, i.uv);
				fixed4 RimColor = tex2D(_RimTex, rimUV );  //对发光纹理采样
                return col + RimColor*fixed4(1,0,0,1);
            }

模型放大以后,法线的方向会发生变化,使用逆阵处理

 fixed4 frag (v2f i) : SV_Target
            {      
                float2 rimUV = mul(UNITY_MATRIX_IT_MV, normalize(i.normal)).xy * 0.5 + 0.5;  
                fixed4 col = tex2D(_MainTex, i.uv);
				fixed4 RimColor = tex2D(_RimTex, rimUV );  //对发光纹理采样
                return col + RimColor*fixed4(1,0,0,1);
            }

免责声明:图片素材来源于Unity资源商店免费资源包,仅供学习使用
参考资料:https://edu.manew.com/my/course/443/material?type=material
参考书籍:冯乐乐《unityshader入门精要》
参考书籍:郭浩瑜,张鹤《unity3D shaderLab开发实战详解》

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Unity Shader是一种专门用于制作游戏的图形渲染程序。在大多数游戏中,我们都希望让模型展现出崭新的效果。有时候,如果希望模型边缘看起来发光,则需要使用Shader来进行处理。其中,模型边缘自发光需要的是特别的处理技巧。 在Unity Shader实现模型边缘自发光的方法有很多,但最常见的方式就是通过控制深度、法线和颜色等参数来增加颜色和光亮度。首先,我们需要分析模型边缘的特性,找到边缘的物理体积和光照条件,然后再运用一定的OpenGL技巧给予模型侧面以足够的颜色和光亮度。 另,还有一种方式可以实现模型的边缘自发光。那就是将模型的整体颜色设置为辉光色,然后通过代码控制其背面渐变,来实现边缘的自发光效果。这种方式主要是采用jungle Shader技术来实现模型纹理和物理光源之间的交互效果,运用较为广泛。 总之,实现Unity Shader模型边缘自发光就需要理解模型的特性,进行合适的参数设置和处理技巧,才能得到理想的效果。不同的游戏场景和模型也会有不同的处理方式,需要开发者结合实际情况进行具体分析和调整。 ### 回答2: Unity Shader中的模型边缘自发光,可以通过使用描边Shader实现。描边Shader是通过计算法线与表面之间的夹角来确定边缘,并将其与指定颜色进行混合,从而产生模型边缘的自发光效果实现效果的方法有多种,一种常用的做法是在一个关于深度等级的RenderTexture上绘制描边效果,然后将其与原始场景渲染结果叠加在一起。此,还可以使用几何着色器(Geometry Shader)来实现描边效果,但需要支持OpenGL 4.0以上版本的显卡才能正常运行。 描边Shader效果取决于边缘权重的计算方法和颜色混合技术。使用不同的模型接口和最小距离阈值,可以调整边沿的宽度和数量。同时,利用颜色叠加,可以给边缘添加动态效果,比如透明度和闪烁等。在制作游戏时,可以通过组合描边Shader与材质、纹理、照明等属性,增强游戏画面的视觉效果,从而提高游戏的品质和受欢迎程度。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值