当前位置: 首页 > news >正文

前网易技术美术总监(韩国人)写的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 年前

    实际算法很少,都是prop预设。。。

雪落桑田

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

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

 

相关文章:

  • Matcap Shader 详解【4】 - 多材质与混合材质
  • 一道技术美术的面试题
  • 塞尔达风之杖技术分析-角色渲染和面部表情
  • 关于 Unreal4 技美:如果你希望往UE技美方向发展。。。。
  • [UE4]性能优化指南(美术向)
  • 【多图】【严肃的技术帖】用UE4做黑丝材质
  • UE4静态网格模型距离场DistanceFields美术应用
  • Rendering in UE4(Epic Game TA-Homam Bahnassi讲座个人笔记)
  • Unity3D研究院编辑器之ManagedStaticReferences()静态引用(二十九)
  • 总结《Ray Tracing from the Ground Up》
  • Sunflow
  • Mastering Unity Project Folder Structure. Level 1 – Reserved Folders, Unity 各个文件夹介绍
  • Unity 资源释放
  • UE4 Hair Shading
  • Gameplay Ability System
  • 345-反转字符串中的元音字母
  • CSS实用技巧干货
  • Django 博客开发教程 16 - 统计文章阅读量
  • ECS应用管理最佳实践
  • Java的Interrupt与线程中断
  • Java反射-动态类加载和重新加载
  • Kibana配置logstash,报表一体化
  • mongodb--安装和初步使用教程
  • PaddlePaddle-GitHub的正确打开姿势
  • python 装饰器(一)
  • React系列之 Redux 架构模式
  • sessionStorage和localStorage
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 关于使用markdown的方法(引自CSDN教程)
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 选择阿里云数据库HBase版十大理由
  • #if 1...#endif
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (windows2012共享文件夹和防火墙设置
  • (二)c52学习之旅-简单了解单片机
  • (二)Linux——Linux常用指令
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (四)鸿鹄云架构一服务注册中心
  • (一)u-boot-nand.bin的下载
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转) Face-Resources
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • ./configure,make,make install的作用(转)
  • .net CHARTING图表控件下载地址
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .Net mvc总结
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET开源项目介绍及资源推荐:数据持久层
  • .net专家(高海东的专栏)
  • .Net组件程序设计之线程、并发管理(一)