前网易技术美术总监(韩国人)写的shader,续行讲解

前网易技术美术总监(韩国人)写的shader,续行讲解

https://zhuanlan.zhihu.com/p/26939686

 

前网易技术美术总监(韩国人)写的shader,续行讲解

前网易技术美术总监(韩国人)写的shader,续行讲解

雪落桑田

雪落桑田

将夸夸其谈,变成脚踏实地

先说明一下,这是一个标准材质:

材质功能如下:

1.pbr标准材质,有三通道合成,pbr图的R精糙度,G金属性,B是AO

2.里面有自发光控制图,控制自发光

3.受伤变红,其实就是一个内发光的东西

4.材质渐变隐匿效果,而且带颜色边的隐匿效果

Shader "Custom/NewSurfaceShader" {

Properties {

//[Header(SURFACE PROPERTICE)]这个表示分类,里面不可以有中文

[Header(SURFACE PROPERTICE)]

_CutOff("CutOff", Range(0,1)) = 1.0

_Color ("Main Color", Color) = (1,1,1,1)

[NoScaleOffset]_MainTex ("Albedo (RGB)", 2D) = "white" {}

[NoScaleOffset]_BurnMap("法线图 (RGB)", 2D) = "white" {}

//NoScaleOffset有这个关键字,就不可以

[Header(MICROFACET LOD 0 PHASE PROPERTICE)]

[NoScaleOffset]_PBRTex("pbr图 (RGB),R粗糙度,G 金属性,B AO", 2D) = "white" {}

[Header(TESTCODE)]

[FloatRange]_MetallicAdjust("Metallic Adjust", Range(0,1.5)) = 1.0

[FloatRange]_RoughnessAdjust("Roughness Adjust", Range(0,1.5)) = 1.0

[FloatRange]_AOAdjust ("A Occulusion Adjust", Range(0,2)) = 1.0

//自发光

[Header(SELF ILLUMINATTON)]

[NoScaleOffset]_EmissionTex( "Emission" ,2D) = "white"{}

_EmissionScale( "Emission Scale" , Range(0,1))=0

//受伤效果

[Header(BE SHOT EFFECT)]

// KeywordEnum表示一个开关,如下图

[KeywordEnum(Off,On)]_HitEffect("HitEffect state",Float) = 0

_GlowColor("Glow Color",Color)=(1,1,1,1)

[PowerSlider(3.0)]_RimPower("Rim Power",Range(0.0,10))=1

//隐匿效果

[Header(DISSOLVE FX)]

[KeywordEnum(Off,On)]_DissolveEffect("Death state",Float) = 0

_BurnSize("Burn Size" , Range(0.0,1.0)) = 0.05

[NoScaleOffset]_BurnRamp("Burn Ramp(RGB)" ,2D) = "white"{}

[NoScaleOffset]_DissolveTex("Dissolve Texture" ,2D) = "white"{}

_DissolvePower("Dissolve Power" , Range(-0.2,0.25)) = -0.2

_DissolveEmissionColor("Dissolve Emission Color" , Color) = (1,1,1)

}

SubShader{

//不透明材质,不可以版本检查

Tags { "RenderType" = "Opaque" "PerformanceChecks"="false" }

LOD 400

AlphaTest Greater[_DissolvePower]//透明度测试,大于这个值不渲染出来

CGPROGRAM

//#include "../PanguShaderCommon.cginc"

// Physically based Standard lighting model, and enable shadows on all light types

//表面标准材质,不接受灯光,动态光,没有雾,没有前置,没有meta

#pragma surface surf Standard nolightmap nodynlightmap nofog nometa noforwardadd vertex:vert

//手机上要加这个,表示最快ARB,不明白加就是行了

#pragma fragmentoption ARB_precision_hint_fastest

//下面是两个预置宏

#pragma multi_compile _HITEFFECT_OFF _HITEFFECT_ON

#pragma multi_compile _DISSOLVEFFECT_OFF _DISSOLVEEFFECT_ON

//不能在手机gles

#pragma exclude_renderers gles

//只有dx11,opengl,gles3,苹果的metal 苹果5s以上

#pragma only_renderers d3d11 glcore gles3 metal

//glsl编译到移动平台GLSL时,关闭顶点着色器中对法线和切线进行自动规范化

#pragma glsl_no_auto_normalization

//sampler2d的半浮点型

sampler2D_half _MainTex;

sampler2D_half _BumpMap;

sampler2D_half _PBRTex;

half _CutOff;

fixed4 _Color;

sampler2D_half _EmissionTex;

#pragma target 3.5 //3.5以上,就是sm3以上

fixed _MetallicAdjust, _RoughnessAdjust, _AOAdjust, _EmissionScale;

//受到伤害时表面内发光

#if _HITEFFECT_ON

fixed4 _GlowColor;

fixed _RimPower;

#endif

//消去材质

#if _DISSOLVEEFFECT_ON

sampler2D_half _DissolveTex;

sampler2D_half _BurnRamp;

fixed3 _DissolveEmissionColor;

fixed _DissolvePower;

fixed _BurnSize;

#endif

struct Input {

float2 uv_MainTex;

half2 uv_DissolveTex;

float viewDir;

fixed color;

INTERNAL_DATA

};

//INTERNAL_DATA声明,可以访问经过法线贴图修改后的平面的法线信息

void vert(inout appdata_full v, out Input o)

{

UNITY_INITIALIZE_OUTPUT(Input, o);

o.color = v.color;

}

void surf (Input IN, inout SurfaceOutputStandard o) {

// Albedo comes from a texture tinted by color

fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;

o.Albedo = c.rgb;

//clip就是消去

#if _DISSOLVEEFFECT_ON

clip(tex2D(_DissolveTex, IN.uv_DissolveTex).rgb - (_DissolvePower));

half4 dissolveTex = tex2D(_DissolveTex, IN.uv_DissolveTex);

#endif

fixed3 pbrTexRGB = tex2D(_PBRTex, IN.uv_MainTex).rgb;

o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex));

o.Smoothness = pbrTexRGB.r*_RoughnessAdjust;

o.Metallic = pbrTexRGB.r*_MetallicAdjust;

o.Occlusion = lerp(pbrTexRGB.b, 1, 1 - _AOAdjust);

half3 e = tex2D(_EmissionTex, IN.uv_MainTex).rgb;

o.Emission = e.rgb*_EmissionScale;

#if _HITEFFECT_ON

half rimFactor = 1 - max(min(dot(normalize(IN.viewDir), o.Normal), 1),0);

half4 r_c = ((rimFactor *rimFactor) + (rimFactor*(rimFactor*0.425)))*_RimPower*_GlowColor;

o.Albedo += r_c;

#else

o.Albedo;

#endif

#if _DISSOLVEEFFECT_ON

o.Alpha = (_DissolvePower - dissolveTex.r);

if (( o.Alpha < 0 ) && ( o.Alpha > - 0.05))

{

o.Alpha = 1;

o.Emission = tex2D(_BurnRamp, fixed2(dissolveTex.r*(1 / _BurnSize), 0));

o.Albedo = _DissolveEmissionColor*o.Emission;

}

#endif

o.Alpha = c.a- _CutOff;//透明度就透明度减于cutoff值

if (c.a < _CutOff)

{

discard;

}

}

ENDCG

}

FallBack "Diffuse"

}

编辑于 2019-01-19

shader

Unity(游戏引擎)

质感设计(Material Design)

推荐阅读

对SSS Matcap贴图的研究

对SSS Matcap贴图的研究

Chain

【请别再说Unity不如Unreal】Unity室内场景 + 光照练习 III

【请别再说Unity不如Unreal】Unity室内场景 + 光照练习 III

邓佳迪发表于在木的游戏...

Shader学习:初步了解卡通渲染Cel Shading

Shader学习:初步了解卡通渲染Cel Shading

赤土晴絵

Unity2018 Shader Graph 学习笔记(八) 水波涟漪的实现

Unity2018 Shader Graph 学习笔记(八) 水波涟漪的实现

傲娇的露易...发表于shade...

3 条评论

写下你的评论...

 

  • 肆音

    肆音1 年前

    谢谢分享~

雪落桑田

雪落桑田 (作者) 回复墓后煮屎人1 年前

其实是给初级玩家,看一下实际的shader每句话有什么意思。并没有实际光影算法

 

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值