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

【实现100个unity特效之28】皮毛shader着色器 实现可以用动的毛茸茸毛绒绒效果

效果

在这里插入图片描述

文章目录

  • 效果
  • 一、内置渲染管线
    • 下载
    • 支持几只着色器
    • Basic 基本
    • Attributes 属性
    • Force 力
    • Rim Color 轮辋颜色
  • 二、URP
    • 下载
    • 几只毛发着色器实现的示例
      • Shell 壳
      • Fin 翅片
      • Fur Polygon 毛发多边形
      • Compare 比较
      • Move 移动
  • 完结

一、内置渲染管线

缺点是仅支持内置渲染管线。且无法毛发无法动

下载

Github: https://github.com/Sorumi/UnityFurShader

支持几只着色器

在这里插入图片描述

Basic 基本

具有环境光、漫反射和镜面反射的基本毛发着色器。
在这里插入图片描述

Shader "Fur/FurBasicShader"
{Properties{_Color ("Color", Color) = (1, 1, 1, 1)_Specular ("Specular", Color) = (0, 0, 0, 1)_Shininess ("Shininess", Range(0.01, 128.0)) = 8.0_MainTex ("Texture", 2D) = "white" { }_FurTex ("Fur Pattern", 2D) = "white" { }_FurLength ("Fur Length", Range(0.0, 1)) = 0.5}Category{Tags { "RenderType" = "Transparent" "IgnoreProjector" = "True" "Queue" = "Transparent" }Cull OffZWrite OnBlend SrcAlpha OneMinusSrcAlphaSubShader{Pass{CGPROGRAM#pragma vertex vert_surface#pragma fragment frag_surface#define FURSTEP 0.00#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.05#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.10#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.15#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.20#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.25#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.30#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.35#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.40#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.45#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.50#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.55#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.60#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.65#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.70#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.75#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.80#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.85#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.90#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.95#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 1.00#include "FurHelper.cginc"ENDCG}}}
}

Attributes 属性

添加毛发属性:密度、薄度、着色。
在这里插入图片描述

Shader "Fur/FurAttributesShader"
{Properties{_Color ("Color", Color) = (1, 1, 1, 1)_Specular ("Specular", Color) = (1, 1, 1, 1)_Shininess ("Shininess", Range(0.01, 256.0)) = 8.0_MainTex ("Texture", 2D) = "white" { }_FurTex ("Fur Pattern", 2D) = "white" { }_FurLength ("Fur Length", Range(0.0, 1)) = 0.5_FurDensity ("Fur Density", Range(0, 2)) = 0.11_FurThinness ("Fur Thinness", Range(0.01, 10)) = 1_FurShading ("Fur Shading", Range(0.0, 1)) = 0.25}Category{Tags { "RenderType" = "Transparent" "IgnoreProjector" = "True" "Queue" = "Transparent" }Cull OffZWrite OnBlend SrcAlpha OneMinusSrcAlphaSubShader{Pass{CGPROGRAM#pragma vertex vert_surface#pragma fragment frag_surface#define FURSTEP 0.00#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.05#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.10#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.15#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.20#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.25#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.30#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.35#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.40#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.45#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.50#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.55#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.60#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.65#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.70#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.75#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.80#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.85#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.90#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.95#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 1.00#include "FurHelper.cginc"ENDCG}}}
}

Force 力

加力:全局力和局部力。
在这里插入图片描述

Shader "Fur/FurForceShader"
{Properties{_Color ("Color", Color) = (1, 1, 1, 1)_Specular ("Specular", Color) = (1, 1, 1, 1)_Shininess ("Shininess", Range(0.01, 256.0)) = 8.0_MainTex ("Texture", 2D) = "white" { }_FurTex ("Fur Pattern", 2D) = "white" { }_FurLength ("Fur Length", Range(0.0, 1)) = 0.5_FurDensity ("Fur Density", Range(0, 2)) = 0.11_FurThinness ("Fur Thinness", Range(0.01, 10)) = 1_FurShading ("Fur Shading", Range(0.0, 1)) = 0.25_ForceGlobal ("Force Global", Vector) = (0, 0, 0, 0)_ForceLocal ("Force Local", Vector) = (0, 0, 0, 0)}Category{Tags { "RenderType" = "Transparent" "IgnoreProjector" = "True" "Queue" = "Transparent" }Cull OffZWrite OnBlend SrcAlpha OneMinusSrcAlphaSubShader{Pass{CGPROGRAM#pragma vertex vert_surface#pragma fragment frag_surface#define FURSTEP 0.00#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.05#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.10#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.15#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.20#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.25#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.30#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.35#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.40#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.45#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.50#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.55#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.60#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.65#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.70#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.75#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.80#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.85#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.90#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.95#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 1.00#include "FurHelper.cginc"ENDCG}}}
}

Rim Color 轮辋颜色

Add rim color 添加边缘颜色
在这里插入图片描述

Shader "Fur/FurRimColorShader"
{Properties{_Color ("Color", Color) = (1, 1, 1, 1)_Specular ("Specular", Color) = (1, 1, 1, 1)_Shininess ("Shininess", Range(0.01, 256.0)) = 8.0_MainTex ("Texture", 2D) = "white" { }_FurTex ("Fur Pattern", 2D) = "white" { }_FurLength ("Fur Length", Range(0.0, 1)) = 0.5_FurDensity ("Fur Density", Range(0, 2)) = 0.11_FurThinness ("Fur Thinness", Range(0.01, 10)) = 1_FurShading ("Fur Shading", Range(0.0, 1)) = 0.25_ForceGlobal ("Force Global", Vector) = (0, 0, 0, 0)_ForceLocal ("Force Local", Vector) = (0, 0, 0, 0)_RimColor ("Rim Color", Color) = (0, 0, 0, 1)_RimPower ("Rim Power", Range(0.0, 8.0)) = 6.0}Category{Tags { "RenderType" = "Transparent" "IgnoreProjector" = "True" "Queue" = "Transparent" }Cull OffZWrite OnBlend SrcAlpha OneMinusSrcAlphaSubShader{Pass{CGPROGRAM#pragma vertex vert_surface#pragma fragment frag_surface#define FURSTEP 0.00#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.05#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.10#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.15#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.20#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.25#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.30#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.35#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.40#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.45#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.50#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.55#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.60#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.65#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.70#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.75#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.80#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.85#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.90#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 0.95#include "FurHelper.cginc"ENDCG}Pass{CGPROGRAM#pragma vertex vert_base#pragma fragment frag_base#define FURSTEP 1.00#include "FurHelper.cginc"ENDCG}}}
}

二、URP

下载

https://github.com/hecomi/UnityFurURP

几只毛发着色器实现的示例

这是通用渲染管道中毛发着色器实现的示例。它包括以下功能:

  • 3种方法(壳/鳍/毛发多边形)(Shell / Fin / Fur Polygon)
  • 1使用几何着色器(和Fin的细分)的通道
  • Lit / Unlit 点亮/未点亮
  • 使用法线贴图进行照明计算
  • 边缘光照
  • 动画动作

Shell 壳

在这里插入图片描述

Fin 翅片

在这里插入图片描述

Fur Polygon 毛发多边形

在这里插入图片描述

Compare 比较

在这里插入图片描述

Move 移动

在这里插入图片描述
在这里插入图片描述

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述


http://www.mrgr.cn/news/14434.html

相关文章:

  • 运维-1.日志
  • 【AI】:探索在图像领域的无限可能
  • 设计模式之代理模式
  • JavaScript中闭包详解+举例,闭包的各种实践场景:高级技巧与实用指南
  • 数据结构——栈和队列
  • 用QT写一个加载模板文件,替换关键字为实际值
  • 《黑神话悟空》:国产3A游戏的崛起与AI绘画技术的融合
  • Unity实战案例 2D小游戏HappyGlass(游戏管理类脚本)
  • 引擎切换pdf识别简历分析
  • HTTP的通讯流程
  • 群晖NAS本地使用Docker搭建Home Assistant智能家居平台与远程访问
  • 贪心算法三道经典题(买卖股票,分发饼干)
  • 300W才能开通,A股自动交易公平吗?散户如何实现程序化交易?|邢不行
  • 【STM32】IIC
  • 深入理解 Go 语言并发编程--管道(channel) 的底层原理
  • 2024.8.29 作业
  • 【准则化的思想】绝对充分度
  • 探索 Linux 内核启动过程
  • 爬取数据时,如何避免违法问题
  • 使用ddns-go实现自动配置IPv6的DDNS