Unity Shader学习:素描效果

这是乐乐大佬书里的非真实渲染,其中的算法还是挺有意思的,感兴趣的小伙伴可以试一试。

素描效果基本原理:先将物体进行描边画出轮廓,计算物体的漫反射部分,漫反射越暗表明颜色越暗,然后根据漫反射的值来设置采样贴图的权重。

采样贴图:


shader部分:

Shader "Unlit/Sketch"
{Properties{_Color("Color",Color) = (1,1,1,1)//贴图平铺系数_TileFactor("TileFactor", Range(0, 10)) = 1_Hatch0("Hatch0",2D)="white"{}_Hatch1("Hatch1",2D) = "white"{}_Hatch2("Hatch2",2D) = "white"{}_Hatch3("Hatch3",2D) = "white"{}_Hatch4("Hatch4",2D) = "white"{}_Hatch5("Hatch5",2D) = "white"{}//描边系数_OutlineFactor("OutlineFactor",Range(0.0,0.1))=0.01}SubShader{Tags{ "Queue" = "Transparent" }//描边使用两个Pass,第一个pass沿法线挤出一点,只输出描边的颜色Pass{//剔除正面,只渲染背面Cull Front//关闭深度写入ZWrite Off//控制深度偏移,描边pass远离相机一些,防止与正常pass穿插Offset 1,1CGPROGRAM#include "UnityCG.cginc"#pragma vertex vert#pragma fragment fragfloat _OutlineFactor;struct v2f{float4 pos : SV_POSITION;};v2f vert(appdata_full v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);//将法线方向转换到视空间float3 vnormal = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);//将视空间法线xy坐标转化到投影空间float2 offset = TransformViewToProjection(vnormal.xy);//在最终投影阶段输出进行偏移操作o.pos.xy += offset * _OutlineFactor;return o;}fixed4 frag(v2f i) : SV_Target{return float4(0,0,0,1);}ENDCG}Pass{CGPROGRAM#include "UnityCG.cginc"#include "Lighting.cginc"//使用阴影需添加#include "AutoLight.cginc"#pragma vertex vert#pragma fragment frag//使主要平行光产生阴影#pragma multi_compile_fwdbasefloat4 _Color;float _TileFactor;sampler2D _Hatch0;sampler2D _Hatch1;sampler2D _Hatch2;sampler2D _Hatch3;sampler2D _Hatch4;sampler2D _Hatch5;struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;//6张依次加深的贴图float3 hatchWeights0:TEXCOORD1;float3 hatchWeights1:TEXCOORD2;//声明阴影SHADOW_COORDS(4)float3 worldPos:TEXCOORD3;};v2f vert (appdata_full v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);//平铺系数越大,显示的贴图越密集o.uv = v.texcoord* _TileFactor;float3 worldLightDir = normalize(WorldSpaceLightDir(v.vertex));float3 worldNormal = UnityObjectToWorldNormal(v.normal);//漫反射float diffuse = max(0, dot(worldLightDir, worldNormal));o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz ;//六张图片的权重o.hatchWeights0 = float3(0, 0, 0);o.hatchWeights1 = float3(0, 0, 0);//根据漫反射值计算权重,漫反射越暗,线条越密集float hatchFactor = diffuse * 7.0;if (hatchFactor > 6.0) {}else if (hatchFactor > 5.0) {o.hatchWeights0.x = hatchFactor - 5.0;}else if (hatchFactor > 4.0) {o.hatchWeights0.x = hatchFactor - 4.0;o.hatchWeights0.y = 1.0 - o.hatchWeights0.x;}else if (hatchFactor > 3.0) {o.hatchWeights0.y = hatchFactor - 3.0;o.hatchWeights0.z = 1.0 - o.hatchWeights0.y;}else if (hatchFactor > 2.0) {o.hatchWeights0.z = hatchFactor - 2.0;o.hatchWeights1.x = 1.0 - o.hatchWeights0.z;}else if (hatchFactor > 1.0) {o.hatchWeights1.x = hatchFactor - 1.0;o.hatchWeights1.y = 1.0 - o.hatchWeights1.x;}else {o.hatchWeights1.y = hatchFactor;o.hatchWeights1.z = 1.0 - o.hatchWeights1.y;}//把计算的阴影传到fragment中TRANSFER_SHADOW(o);return o;}fixed4 frag (v2f i) : SV_Target{ float4 hatchTex0 = tex2D(_Hatch0, i.uv) * i.hatchWeights0.x;float4 hatchTex1 = tex2D(_Hatch1, i.uv) * i.hatchWeights0.y;float4 hatchTex2 = tex2D(_Hatch2, i.uv) * i.hatchWeights0.z;float4 hatchTex3 = tex2D(_Hatch3, i.uv) * i.hatchWeights1.x;float4 hatchTex4 = tex2D(_Hatch4, i.uv) * i.hatchWeights1.y;float4 hatchTex5 = tex2D(_Hatch5, i.uv) * i.hatchWeights1.z;//漫反射暗色部分权重越大,白色越少float4 whiteColor = float4(1, 1, 1, 1)*(1 - i.hatchWeights0.x - i.hatchWeights0.y - i.hatchWeights0.z - i.hatchWeights1.x - i.hatchWeights1.y - i.hatchWeights1.z);float4 hatchColor = hatchTex0 + hatchTex1 + hatchTex2 + hatchTex3 + hatchTex4 + hatchTex5+ whiteColor;//使物体接受阴影UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);return float4(hatchColor.rgb*_Color.rgb*atten, 1.0);}ENDCG}       }
}

Unity Shader学习:素描效果相关推荐

  1. Unity Shader 学习笔记(33) 全局光照(GI)、反射探针、线性空间和伽马空间、高动态范围(HDR)

    Unity Shader 学习笔记(33) 全局光照(GI).反射探针.线性空间和伽马空间.高动态范围(HDR) 参考书籍:<Unity Shader 入门精要> [<Real-Ti ...

  2. Unity Shader学习-高光反射

    Unity Shader学习-高光反射 高光反射计算公式 高光反射 = 光源的色彩和强度 * 材质的高光反射系数 * pow(max(0,视角方向 · 反射方向),_Gloss) 视角方向 = ref ...

  3. Unity Shader学习:SSAO屏幕环境光遮蔽

    Unity Shader学习:SSAO屏幕环境光遮蔽 主要思路:1.随机采样像素法线半球周围的像素,平均对比与该像素深度是否处在暗处.2.双边滤波去噪点.3.后期AO图与原图混合. 原文链接:http ...

  4. Unity Shader学习:动态模糊(shutter angle方式)

    Unity Shader学习:动态模糊 动态模糊一般有帧混合和motion vector两种,这里主要介绍motion vector的方法. Keijiro源码:https://github.com/ ...

  5. Unity Shader学习:水墨效果

    Unity Shader学习:水墨效果 偶然在网上看到9级铁甲蛹大神的水墨风格后处理觉得挺有意思,参照着实现一下,还是涉及到之前油画效果的算法,叫什么滤波暂时不清楚,应该用来处理手绘效果挺多的. 水墨 ...

  6. Unity Shader学习:体积光/体积阴影

    Unity Shader学习:体积光/体积阴影 在前向渲染下实现平行光的体积光影效果,需要全屏深度图,延迟渲染会更划算. 思路:通过ray marching的步进点位置计算该点是否在阴影中,采样阴影贴 ...

  7. Unity Shader学习:SSR屏幕空间反射

    Unity Shader学习:SSR屏幕空间反射 本文在前向渲染模式下实现,延迟渲染更适合SSR,这里只简单的实现下,未作更深入的优化. 思路:沿视线和法线的反射向量步进光线,判断打到物体(这里用的是 ...

  8. Unity Shader学习:Dissolve消融效果

    Unity Shader学习:Dissolve消融效果 消融效果在游戏里非常常用,这里简单的实现下,代码里用到了if分支在shader里可能会费一点,如果想直接用puppet_master大佬版本的话 ...

  9. 《Unity Shader入门精要》学习笔记第5章 开始Unity Shader学习之旅

    本文章用于帮助自己学习,因此只记录一些个人认为比较重要或者还不够熟悉的内容. 原作者:http://blog.csdn.net/candycat1992/article/ 第五章 开始Unity Sh ...

最新文章

  1. 手把手教你 MongoDB 的安装与详细使用(二)
  2. UITextField 详解
  3. php如何一篇文章替换敏感字,php实现的替换敏感字符串类实例
  4. (0020)iOS 开发之-设计模式-懒加载解惑
  5. MySQL 数据格式化
  6. 中国大学MOOC 计算机组成原理第4章 测试(中)
  7. POJ 2142——扩展欧几里得
  8. 白裤子变粉裤子怎么办_使用裤子构建构建数据科学的monorepo
  9. OpenCV与图像处理学习一——图像基础知识、读入、显示、保存图像、灰度转化、通道分离与合并
  10. 苹果手机没充满电就拔下,会对电池造成伤害吗?
  11. FISCO BCOS(八)——— 一键部署 WeBase
  12. 设置宽度 seaborn barplot_Seaborn入门:详解barplot和countplot
  13. 极客导航 - 建站教程的背景
  14. bat快捷方式启动局域网共享文件
  15. 全国计算机能力挑战赛含金量高吗,大学里,有哪些含金量高,又容易得奖的国家级比赛?...
  16. Hibernate主键生成策略
  17. SSH localhost 报错解决方案
  18. android按钮被遮住,解决Android 虚拟按键遮住了页面内容的问题
  19. Mybatis中#和$的区别
  20. Altera FPGA程序固化(软件+硬件)

热门文章

  1. Kotlin 企业级应用开发教程(Spring 5 + Spring Boot 2.0 + MyBatis)
  2. jstack 命令详解
  3. Go 语言学习总结(8)—— Go 自学者必学的教程大纲
  4. 【宇麦科技】如何实现无密码登录?群晖Secure SignIn设置全解析
  5. 一款炫酷的相册动画合集【源码分享】
  6. 手机/电脑/U盘:电视文件管理
  7. 地方论坛怎样做线上及线上推广
  8. 汉诺塔+汉诺四塔(C/C++)
  9. go-elasticsearch 官方包操作合集
  10. C#如何把图片存储到数据库中