效果图

用来做头发上的光泽

这个又叫做天使环

备注

各向异性引入切线来计算光照

代码

Shader "DC/CelShading/CelShading"
{Properties{_Exponent("Exponent", float) = 1[Range(0, 1)]_Scale("Scale", Range(0, 1)) = 1_BaseColor("BaseColor", Color) = (1,1,1,1)}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{HLSLPROGRAM#pragma vertex vert#pragma fragment frag#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"            struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal: NORMAL;float4 tangent : TANGENT;};struct v2f{// float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float3 V: TEXCOORD1;float3 T: TEXCOORD2;float3 positionWS: TEXCOORD3;float3 normalWS: TEXCOORD4;};struct Surface{float3 positionWS;float3 normalWS;float3 baseColor;};//支持SRP BatcherCBUFFER_START(UnityPerMaterial)float _Exponent;float _Scale;float4 _BaseColor;CBUFFER_END//计算各向异性光照系数,基于Kajyiya-Kay Modelfloat StrandSpecular(float3 V, float3 T, float3 L, float3 N, float exponent,float scale){//V:点到相机方向//T:副切削方向//L:点到光源方向,如果是直射光就是光的照射方向的反方向//N:法线方向float nl = saturate(dot(N, L));//影响反射float3 H = normalize(L + V);//光源方向和相机方向是高光模型的一部分T = normalize((scale * 2 - 1) * N + T);//这个地方是为了调整天使环位置float dotTH = dot(T, H);float sinTH = sqrt(1.0 - dotTH * dotTH);float dirAtten = smoothstep(-1.0, 0.0, dotTH);float factor = dirAtten * pow(sinTH, exponent);factor *= nl;return factor;}float3 ComputeLighting(float3 lightColor, float3 lightDirectionWS, Surface surface){float3 cameraWS = _WorldSpaceCameraPos;float lambertDot = saturate(dot(surface.normalWS, lightDirectionWS));float halfLambert = lambertDot * 0.5 + 0.5;float3 diffuseColor = halfLambert * lightColor * surface.baseColor;diffuseColor = max(float3(0,0,0), diffuseColor);float3 surfaceColor = diffuseColor;return surfaceColor;}v2f vert (appdata v){VertexNormalInputs normalInputs = GetVertexNormalInputs(v.normal, v.tangent);float3 positionWS = TransformObjectToWorld(v.vertex.xyz);float3 V = GetWorldSpaceNormalizeViewDir(positionWS);v2f o;o.vertex = TransformWorldToHClip(v.vertex.xyz);o.T = normalInputs.bitangentWS;o.V = V;o.positionWS = positionWS;o.normalWS = normalInputs.normalWS;return o;}half4 frag (v2f IN) : SV_Target{float3 L = GetMainLight().direction;float factor = StrandSpecular(IN.V, IN.T, L, IN.normalWS.xyz, _Exponent, _Scale);Surface surface;surface.positionWS = IN.positionWS;surface.normalWS = IN.normalWS;surface.baseColor = _BaseColor.rgb;half3 lightColor = ComputeLighting(_MainLightColor.rgb, normalize(_MainLightPosition.xyz), surface);lightColor = lightColor + factor * _BaseColor.rgb;return half4(lightColor.rgb, 1);}ENDHLSL}}
}

参考资料

Kajyiya-Kay Model

【Cel-Shading】各向异性发丝高光 | Invictus maneo

【卡通渲染】【URP】【头发渲染-各向异性高光】相关推荐

  1. 图形学基础|各项异性与头发渲染

    图形学基础|各项异性与头发渲染 文章目录 图形学基础|各项异性与头发渲染 一.前言 二.各向异性光照 2.1 各向异性光照现象 2.2 ShadingModel扩展 三.头发光照模型 3.1 Kaji ...

  2. PBR渲染(四)——PBR头发渲染

    PBR头发渲染 1.渲染方案 首先在光照模型的选择上,选择了Marschner基于物理的理论模型. 理论模型:头发不是完美的圆柱体或管子,实际上,头发更像是一系列堆叠的圆锥体.每一根头发纤维由角质层( ...

  3. 各向异性渲染(二)Kajiya Kay头发渲染

    介绍 基于之前的各向异性得结果,我们可以再推广到头发渲染.Kajiya Kay头发渲染是一种经验模型.它把头发模型为一条一条细管.然后利用上一章的数学基础,但当然Kajiya Kay也加了几个细节.包 ...

  4. Deferred Shading,延迟渲染(提高渲染效率,减少多余光照计算)

    Deferred Shading,看过<Gems2> 的应该都了解了.最近很火的星际2就是使用了Deferred Shading. 原帖位置:    http://blog.csdn.ne ...

  5. Deferred Shading,延迟渲染(提高渲染效率,减少多余光照计算)【转】

    Deferred Shading,看过<Gems2> 的应该都了解了.最近很火的星际2就是使用了Deferred Shading. 原帖位置:    http://blog.csdn.ne ...

  6. 互动云渲染——云原生渲染的初步探索

    点击上方"LiveVideoStack"关注我们 随着游戏及软件云端化运行能力的支持,大型游戏和软件可以在浏览器.轻客户端以及小程序中运行,在扩展了使用场景边界的同时,也为游戏和软 ...

  7. 【技术美术图形部分】关于前向渲染和延迟渲染

    学习参考 [技术美术百人计划]图形 3.4 延迟渲染管线介绍 <Unity Shader 入门精要> 1 Unity的渲染路径 关于渲染路径,我在图形渲染管线1.0中就提过了,但只是初步的 ...

  8. 前向渲染和延迟渲染基本概念

    前向渲染和延迟渲染基本概念 前言 这一篇是对之前欠的东西,延迟渲染这个东西具体有很多很多值得钻研的东西,这里只是对概念做一个简单的笔记.如果后续再需要深入了解的话,会再另作笔记. 前向渲染 前向渲染是 ...

  9. 什么是3D渲染,3D渲染在CG项目中为何如此重要?

    随着科技的发展,现如今任何人都可以使用免费软件在个人计算机上创作 3D 图像,当然也有人对于专业 3D 艺术的创作方式及其相关工作流程存在一些误解,认为创建一个模型后,在上面放上材料和纹理,就可以立马 ...

  10. c语言中文渲染库,GLSL渲染编程基础与实例 (C#版本) 中文pdf扫描版[136MB]

    本书介绍了用GLSL语言进行三维渲染的方法,以及用大量的实例来展示如何进行GLSL编程.本书详细讲述了GLSL渲染流程: GLSL着色器编程:顶点光照:像素光照:卡通渲染.影线渲染.分形渲染.Gooc ...

最新文章

  1. C语言基础(6)-char类型
  2. Linux 系统如何查看硬盘UUID与修改
  3. robolectric android studio,Android Studio + Robolectric + AndroidAnnotations 根本框架
  4. 华为鸿蒙系统学习笔记11-鸿蒙(HarmonyOS)2.0方舟编译器官方网址开源地址
  5. sql优化的N种方法_持续更新
  6. 伍德里奇计量经济学第四章课后计算机作业,伍德里奇---计量经济学第4章部分计算机习题详解(MATLAB).pdf...
  7. DNS服务器设置正确,DNS服务器配置(DNS各属性详细介绍)
  8. java ini_Java操作Ini文件
  9. halcon入门之_提取遥控器字符并且写入txt文本
  10. java 专业英语单词_java_专业英语单词_力荐
  11. 如何通过网页超链接控制电脑应用程序
  12. OpenGL显示枫叶蝴蝶,无聊作品
  13. 生成树协议中的五种状态Spanning Tree
  14. Linux性能检查命令总结
  15. 计算机技术的发展包括几个阶段,目前电子计算机处于哪个阶段?计算机发展的四个阶段...
  16. 1987 三 比尔·哈利 Bill Haley
  17. PCIe扫盲——PCIe总线怎样做到在软件上兼容PCI总线
  18. #一首国庆生活写照#
  19. 在线画图工具【高仿rose】方便地画工作流
  20. UE4 虚幻引擎,3D数学(二),3D嵌套坐标系。Relative相对位置与World世界位置,Relative相对旋转与World世界坐标旋转。

热门文章

  1. 51book机票总结
  2. 风格化渲染之油画渲染:Customizing Painterly Rendering Styles Using Stroke Processes——论文阅读和个人理解
  3. JavaScript模板字面量(Template literals)介绍
  4. ps的移动工具无法选定图层
  5. 是什么驱使我们为内容付费?
  6. arm 驱动进阶:lcd驱动设计过程
  7. AI 图像智能修复老照片,效果惊艳到我了!| 附代码
  8. 微信,支付宝支付回调的入参处理方法
  9. 计算机二级考试c语言程序填空题,计算机二级C语言练习题:程序填空题
  10. 爬山算法matlab程序,爬山算法和模拟退火算法