前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shader-物体发光效果

Shader-物体发光效果

原创
作者头像
祝你万事顺利
发布2019-05-27 10:17:53
1.5K0
发布2019-05-27 10:17:53
举报
文章被收录于专栏:Unity游戏开发Unity游戏开发

内发光:

将物体边缘

![SelfLight.PNG](https://upload-images.jianshu.io/upload_images/11173460-df185771079671e2.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

```

v2f vert (appdata v)

{

v2f o;

o.vertex = UnityObjectToClipPos(v.vertex);

o.uv = TRANSFORM_TEX(v.uv, _MainTex);

o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);

o.worldPos = mul(unity_ObjectToWorld, v.vertex);

return o;

}

fixed4 frag (v2f i) : SV_Target

{

// sample the texture

fixed4 col = tex2D(_MainTex, i.uv);

float3 worldNormal = normalize(i.worldNormal);

float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);

float cosValue = dot(worldNormal, viewDir);

//cos值大于阈值时不实现自发光效果

if (cosValue >= _Threshold) {

cosValue = 1;

}

return col + _SelfColor * (1-cosValue)*_Strength;

}

```

外发光:

使用法线外拓的方式,再创建一个Pass

![内发光与泛光.PNG](https://upload-images.jianshu.io/upload_images/11173460-4f543ba5cf86a909.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

```

Shader "Unlit/SelfLight"

{

Properties

{

_MainTex ("Texture", 2D) = "white" {}

_SelfColor("SelfColor",Color) = (1,1,1)

_Threshold("threshold",Range(0,1)) = 0.2

_Strength("Strength",Range(0,1)) = 1

_Size("lightSize",Range(0,5)) = 0.1

_OutLightPow("pow",Range(0,2)) = 1

_OutLightStrength("outLightStrength",Range(0,2)) = 1

_NormalSize("NormalSize",Range(0,1)) = 0.01

}

SubShade

{

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 worldNormal : TEXCOORD1;

float3 worldPos : TEXCOORD2;

};

sampler2D _MainTex;

float4 _MainTex_ST;

fixed4 _SelfColor;

float _Threshold;

float _Strength;

v2f vert (appdata v)

{

v2f o;

o.vertex = UnityObjectToClipPos(v.vertex);

o.uv = TRANSFORM_TEX(v.uv, _MainTex);

o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);

o.worldPos = mul(unity_ObjectToWorld, v.vertex);

return o;

}

fixed4 frag (v2f i) : SV_Target

{

// sample the texture

fixed4 col = tex2D(_MainTex, i.uv);

float3 worldNormal = normalize(i.worldNormal);

float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);

float cosValue = dot(worldNormal, viewDir);

//cos值大于阈值时不实现自发光效果

if (cosValue >= _Threshold) {

cosValue = 1;

}

return col + _SelfColor * (1-cosValue)*_Strength;

}

ENDCG

}

Pass

{

Tags{ "LightMode" = "Always" }

Blend SrcAlpha One

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#include "UnityCG.cginc"

struct appdata

{

float4 vertex : POSITION;

float3 normal : NORMAL;

};

struct v2f

{

float4 vertex : SV_POSITION;

float3 worldNormal : TEXCOORD1;

float4 worldPos : TEXCOORD2;

};

sampler2D _MainTex;

float4 _MainTex_ST;

float4 _SelfColor;

float _Threshold;

float _Strength;

float _Size;

float _OutLightPow;

float _OutLightStrength;

float _NormalSize;

v2f vert(appdata v)

{

v.vertex.xyz += v.normal * _Size;

v2f o;

o.vertex = UnityObjectToClipPos(v.vertex);

o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);

o.worldPos = mul(unity_ObjectToWorld, v.vertex);

return o;

}

fixed4 frag(v2f i) : SV_Target

{

// sample the texture

float3 worldNormal = normalize(i.worldNormal);

float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);

float cosValue = dot(worldNormal, viewDir);

if (cosValue <= _NormalSize) {

//cosValue = 1;

}

else {

cosValue = 0;

}

float4 color = _SelfColor;

color.a = pow(saturate(cosValue),_OutLightPow);

//_OutLightStrength += cos(10 * _Time.x);

color.a *= _OutLightStrength * dot(viewDir, i.worldNormal);

return color;

}

ENDCG

}

}

}

```

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档