一日一Shader·卡通高光【SS_24】
高光是一种美术用语,指光源照射到物体然后反射到人的眼睛里时,物体上最亮的那个点就是高光,高光不是光,而是物体上最亮的部分——百度百科
在光学模型中,高光是属于反射的一种,故又称为高光反射,受观察方向和光源方向影响。
根据Blinn模型,引入h矢量,并根据下面的公式实现高光效果。
Shader "MyShader/SS_24"
{Properties{_MainTex("Texture", 2D) = ""{} _Normal("Normal", 2D) = ""{} _Emission("Emission",Range(0,1))=0.5_Wrap("Wrap",Range(0,1))=0.5 _Color("Color", Color) = (1,1,1,1) [HDR]_AmbientColor("Ambient Color", Color) = (0.4,0.4,0.4,1)[HDR]_SpecularColor("Specular Color", Color) = (0.9,0.9,0.9,1) _Glossiness("Glossiness", Float) = 20[HDR]_RimColor("Rim Color", Color) = (1,1,1,1)_RimAmount("Rim Amount", Range(0, 1)) = 0.6 _RimThreshold("Rim Threshold", Range(0, 1)) = 0.5 } SubShader{CGINCLUDE #include "Lighting.cginc"#include "AutoLight.cginc"sampler2D _MainTex;fixed4 _MainTex_ST;sampler2D _Normal; fixed4 _Normal_ST;fixed _Emission; fixed _Wrap;fixed _Glossiness;fixed4 _Color;fixed4 _AmbientColor;fixed4 _SpecularColor; fixed4 _RimColor;fixed _RimAmount;fixed _RimThreshold; struct appdata{fixed4 vertex:POSITION;fixed4 tangent : TANGENT;fixed3 normal:NORMAL;fixed4 uv : TEXCOORD0;};struct v2f{fixed4 pos:SV_POSITION;fixed2 uv : TEXCOORD0; fixed3 lightDir : TEXCOORD1; fixed3 worldNormal:TEXCOORD2;fixed3 worldPos:TEXCOORD3;fixed3 viewDir : TEXCOORD4; SHADOW_COORDS(2)};v2f vert(appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal); o.viewDir = WorldSpaceViewDir(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); TRANSFER_SHADOW(o)return o;}fixed4 frag(v2f i):SV_Target{ fixed3 normal = normalize(i.worldNormal);//或用法线贴图fixed3 viewDir = normalize(i.viewDir);fixed NdotL = dot(_WorldSpaceLightPos0, normal);fixed shadow = SHADOW_ATTENUATION(i); fixed lightIntensity = smoothstep(0, 0.01, NdotL * shadow); fixed4 light = lightIntensity * _LightColor0;fixed3 halfVector = normalize(_WorldSpaceLightPos0 + viewDir);fixed NdotH = dot(normal, halfVector);fixed specularIntensity = pow(NdotH * lightIntensity, _Glossiness * _Glossiness);//镜面反射强度fixed specularIntensitySmooth = smoothstep(0.005, 0.01, specularIntensity);//实现色阶fixed4 specular = specularIntensitySmooth * _SpecularColor; fixed rimDot = 1 - dot(viewDir, normal); //边缘 fixed rimIntensity = rimDot * pow(NdotL, _RimThreshold);rimIntensity = smoothstep(_RimAmount - 0.01, _RimAmount + 0.01, rimIntensity);fixed4 rim = rimIntensity * _RimColor;fixed4 sample = tex2D(_MainTex, i.uv);return (light + _AmbientColor + specular + rim) * _Color * sample;} ENDCG Pass{Tags{"LightMode"="UniversalForward"} CGPROGRAM#pragma vertex vert#pragma fragment fragENDCG }}
}
参考:https://roystan.net/articles/toon-shader.html
返回目录:https://blog.csdn.net/yzy1987523/article/details/106676451
一日一Shader·卡通高光【SS_24】相关推荐
- Unity Shader卡通渲染 · 高清渲染管线·HDRP
Unity Shader卡通渲染 · 高清渲染管线·HDRP 前言 最近在研究HDRP管线中的卡通渲染,就想着能不能把官方的UCTS移植到HDRP管线里面去,说干就干,到昨天晚上上传了github,今 ...
- Unity Shader学习-高光反射
Unity Shader学习-高光反射 高光反射计算公式 高光反射 = 光源的色彩和强度 * 材质的高光反射系数 * pow(max(0,视角方向 · 反射方向),_Gloss) 视角方向 = ref ...
- Unity Shader 卡通渲染 模型描边之退化四边形
目录 前言 一.基于空间的边缘检测算法 二.退化四边形 三.Unity中的CommandBuffer和ComputeBuffer 四.构成描边的简单实例 五.模型描边的实现 前言 之前写了一篇< ...
- Unity Shader 卡通渲染 实时模型动画描边的研究
前言 卡通渲染也叫非真实感渲染(英文简写:NPR),"描边"在图形学和数字图像里都叫边缘检测.因此你可以在很多文献网站上面找到很多这类文献,但最后我发现基于图形学使用的方式基本都是 ...
- Unity Shader 卡通渲染 (三):仿塞尔达荒野之息 Shader(顶点色控制细节)
上一篇传送门: https://blog.csdn.net/qq_27534999/article/details/100925621 顶点色在卡通渲染中有挺多应用,本篇会在上一篇的基础上,运用模型顶 ...
- Unity Toon Shader 卡通着色器(一):卡通着色
一直对非真实感渲染 (Non-Photorealistic Rendering) 很感兴趣,正好发现某社出的新游戏中可以选择真实质感或卡通质感,所以想试试在 Unity 里实现一下卡通着色器. 卡通渲 ...
- Unity Shader 卡通水效果(不用深度信息)
文章目录 效果预览 具体实现 采样贴图替换的深度信息 效果预览 公司需要一个不使用深度信息,不用光照模型的水效果.具体实现参照了:卡通风格的水面效果-ToonWater https://zhuanla ...
- Unity Shader 卡通渲染 (一):仿塞尔达荒野之息 Shader(简易版)
温馨提示: 本系列文章面向那些 Shader 刚刚入门,想寻求进一步提升的群体,如果对 Shader 一无所知的话,建议自行搜索其他 Shader入门教程观看学习,再食用本系列文章. 前言: 说起卡通 ...
- unity shader卡通渲染(描边)+阴影+多光源处理
说道卡通渲染,应该都会想到描边: 我所学的描边有三种: 一种是计算边缘深度检测描边 一种是色差检测描边 一种是利用顶点法线向外扩展返回单色pass,使用正面裁剪 我用的第三种: pass {//剔除前 ...
最新文章
- Docker(十):Docker实战 Docker 安装 Nginx
- Python正在勒死R吗?
- Stanford UFLDL教程 主成分分析(PCA)
- html用bmob做留言,bmob js-sdk 在vue中的使用教程
- 从零开始学视觉Transformer (10):目标检测DETR-1
- 【思科百难】RIP两个版本之间能够相互通信?
- 提示microsoft incremental linker已停止工作解决方法
- /dev/shm目录下产生大量的ora_$ORACLE_SID的二进制文件
- MySQL学习(二、简单查询和多行、单行函数)
- 微信防封域名处理 淘客类 检测域名是否被封
- linux内核空间和用户空间认识和区别
- 箴言:统计学的智慧七柱
- 一个web前端专科生面试后的感概
- 重磅消息:微信支付分最新开通方法!
- android系统GUI设计师必会资源图制作工具
- python爬wos数据库,用Python爬行WoS
- 常用的conda命令
- nginx配置缓存时间为不缓存.
- 《观音山》的文艺范儿
- 英语口语智能测试软件,口语易英语口语智能评测训系统