前网易技术美术总监(韩国人)写的shader,续行讲解
前网易技术美术总监(韩国人)写的shader,续行讲解
https://zhuanlan.zhihu.com/p/26939686
前网易技术美术总监(韩国人)写的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贴图的研究
Chain
【请别再说Unity不如Unreal】Unity室内场景 + 光照练习 III
邓佳迪发表于在木的游戏...
Shader学习:初步了解卡通渲染Cel Shading
赤土晴絵
Unity2018 Shader Graph 学习笔记(八) 水波涟漪的实现
傲娇的露易...发表于shade...
3 条评论
写下你的评论...
-
肆音1 年前
谢谢分享~
-
墓后煮屎人1 年前
实际算法很少,都是prop预设。。。
雪落桑田 (作者) 回复墓后煮屎人1 年前
其实是给初级玩家,看一下实际的shader每句话有什么意思。并没有实际光影算法
前网易技术美术总监(韩国人)写的shader,续行讲解相关推荐
- 网易技术美术总监:深度解析次世代手游的贴图与着色技巧
http://youxiputao.com/articles/11838 在5月12日举办的Unite2017开发者大会上,网易盘古游戏部技术美术总监的李正彪分享了关于其内部对于美术和设计各方面的干货 ...
- 芯片技术如此难搞如此复杂,韩国人是怎么会的?
我们熟知的芯片主要分为两大类:处理器和存储,处理器是美国人为王,存储则是韩国人称霸,代表有三星和海力士,这两家主要是做DRAM(用作手机的运存和电脑的内存)和闪存(用作手机的内存和电脑的固定硬盘),其 ...
- 技术系列课回顾 | 网易云信线上万人连麦技术大揭秘
导读:本文根据网易云信资深音视频服务端开发工程师陈策在<MCtalk Live#5:网易云信线上万人连麦技术大揭秘>线上直播分享整理. 文|陈策 网易云信资深音视频服务端开发工程师 大家好 ...
- 专访网易游戏美术总监:寻找美术风格的蓝海
近几年,越来越多新游戏,比如<江南百景图>.<最强蜗牛>,凭借独特的美术实现了差异化竞争,也使风格化美术获得诸多游戏厂商的重视. 但问题在于,为游戏匹配合适的风格化美术并不容易 ...
- 牛人写的设计游戏服务器
转载自 zeeman的博客 - 牛人写的设计游戏服务器 :http://blog.sina.com.cn/s/blog_55d572ca0100uvzt.html 有段时间没有研究技术了,这次正好看到 ...
- 做为技术人员为什么要写博客?
做为技术人员为什么要写博客? 本文只代表个人见解,不代表任立场,如果您认为我的想法是错的那很正常,因为这是我的想法,如果您觉得您的想法和我一样,那我们就是传说中的 "激友"(对生活 ...
- 阿里《Java手册》做一个有技术情怀的人
导读 最近重温了阿里的<码出高效Java开发手册>,感觉最后一页"聊聊成长"这一小块的内容写的很棒,特意把它复制出来,送给每一个技术人,愿你做一个有技术情怀的人. 正文 ...
- 用Python爬取3万多条评论,看韩国人如何评价电影《寄生虫》?
作者 | 朱小五 责编 | 郭 芮 今天给大家带来一个关于电影的数据分析文章.别走啊,这次不是豆瓣,也不是猫眼--真的,今天分析的电影是韩国电影<寄生虫>. 它是由韩国导演奉俊昊自编自 ...
- 华为十年(转贴)原华为牛人写的
华为十年 徐家骏 2007年5月28日 (注:徐是华为数据中心的头,清华硕士,技术超级牛人,一级部门总监,华为副总裁,年收入过千万,数据中心是用火山岩建的深入地下的一个大型建筑.防辐射,可防卫星的电子 ...
最新文章
- 从变量地址到指针再到指针变量
- Science Bulletin:上海植生所王二涛组发表基于绝对丰度的植物根际微生物群落“扩增-选择”组装模型
- oracle安装结束后怎么登录,浅谈Oracle 11g 发行版2 新安装后关于登录的一些基本操作...
- Android之旅---Service
- IoC容器和Dependency Injection模式
- XamarinSQLite教程在Xamarin.Android项目中使用数据库
- Linux内存中加载二进制,linux – 程序退出后二进制文件会留在内存中吗?
- leetcode 363. Max Sum of Rectangle No Larger Than K | 363. 矩形区域不超过 K 的最大数值和(前缀和,图文详解)
- vb 打开sdf数据_DWG、DGN、SDF、DWF!Civil 3D图形数据共享的几种方法
- 数据分析模型 第六章
- 关于联想键盘,如何去除fn 键 联想官方解决方法
- python 报警声音的实现
- 主机电源供电端口-24PIN ,20PIN ,20+4pin区别
- TP Link 路由器 设置
- U盘量产后USB鼠标和键盘都无法使用,如何解决?
- 前东家欠款 1.4 亿?我看贝店爆雷事件
- Laravel Eloquent:API资源
- redis三种集群方案
- 印象笔记 Markdown使用指南
- QualcommMTK平台lcd/tp调试及问题总结(一)----背光