【光照】[各向异性]在UnityURP中的实现
【从UnityURP开始探索游戏渲染】专栏-直达
Kajiya-Kay模型在Unity URP中的BRDF实现
模型原理与特点
Kajiya-Kay模型是一种专门用于模拟头发、毛发等纤维状材质各向异性高光的光照模型,其核心特点是用切线方向替代传统法线方向计算高光反射。该模型具有以下特性:
- 切线空间计算:使用切线向量(Tangent)或副切线(Bitangent)替代法线向量,通过
TdotH = dot(tangent, halfVector)计算高光强度,再转换为TsinH = sqrt(1 - TdotH²)实现条状高光效果。 - 双层高光特性:主高光(Primary Specular)靠近发梢,次高光(Secondary Specular)靠近发根且带有彩色偏移,模拟Marschner模型的散射特性。
- 切线偏移技术:通过噪声贴图扰动切线方向(ShiftTangent函数),增强高光的动态变化和真实感。
URP中的BRDF结构
在Unity URP中,BRDF通常基于Cook-Torrance微表面模型,包含
三个核心组件:
- D项 法线分布函数:描述微表面法线的分布,常用GGX模型。
- F项 菲涅尔项:使用Schlick近似计算反射光强。
- G项 几何遮蔽项:采用Smith联合阴影函数,结合光方向和视线方向的遮蔽效果。
URP中的BRDF数据通常包含以下字段:
csharp
struct BRDF {
float3 diffuse;// 材料身颜色
float3 specular;// 材料本身的高光颜色
float roughness;// 粗糙度
float perceptualRoughness;// 感知粗糙度
float fresnel;// 材料本身菲涅尔反射颜色
}
Kajiya-Kay与BRDF的整合方法
要将Kajiya-Kay模型融入URP的BRDF框架,需要进行以下
关键处理:
- 切线空间转换:
- 使用TBN矩阵(切线-副切线-法线矩阵)将标准BRDF计算转换到切线空间
- 在顶点着色器中计算并传递切线空间向量
- 高光项替换:
- 用Kajiya-Kay的
D_KajiyaKay函数替换标准BRDF中的D项 - 保持F项和G项不变,或根据需要进行调整
- 用Kajiya-Kay的
- 双层高光实现:
- 主高光使用原始切线方向计算
- 次高光使用偏移后的切线方向计算,并赋予不同颜色
完整实现代码
以下是Kajiya-Kay BRDF在URP Shader中的完整实现框架:
hlsl
// 1. 计算偏移后的切线方向
float3 ShiftTangent(float3 T, float3 N, float shift) {
return normalize(T + N * shift);
}
// 2. Kajiya-Kay高光计算
float D_KajiyaKay(float3 T, float3 H, float shininess) {
float TdotH = dot(T, H);
float sinTH = sqrt(1.0 - TdotH * TdotH);
return pow(sinTH, shininess);
}
// 3. BRDF整合计算
void Lighting_KajiyaKay(
SurfaceData surface,
inout Light light,
inout BRDFData brdf,
inout float3 specular)
{
// 切线空间转换
float3 T = surface.tangent;
float3 B = cross(surface.normal, T) * surface.tangent.w;
float3 N = surface.normal;
// 计算主高光
float3 H = normalize(light.dir + viewDir);
float3 T_shifted = ShiftTangent(T, N, _ShiftAmount1);
float3 H_shifted = normalize(light.dir + viewDir);
// 计算次高光
float3 T_shifted2 = ShiftTangent(T, N, _ShiftAmount2);
float3 H_shifted2 = normalize(light.dir + viewDir);
// 计算高光项
float specular1 = D_KajiyaKay(T_shifted, H_shifted, _Shininess1);
float specular2 = D_KajiyaKay(T_shifted2, H_shifted2, _Shininess2);
// 组合结果
specular = _SpecColor1 * specular1 + _SpecColor2 * specular2;
// 标准BRDF漫反射部分
brdf.diffuse = surface.color * (1.0 - _Metallic);
brdf.specular = lerp(0.04, surface.color, _Metallic);
brdf.roughness = _Roughness;
}
实现要点说明
纹理需求:
- 基础色贴图(Albedo)
- 各向异性噪声贴图(控制高光扰动)
- 半透明通道(Alpha贴图)
优化技巧:
- 利用URP内置函数
SafeNormalize和NormalizeNormalPerPixel提升计算稳定性 - 副切线(Bitangent)通过
cross(N, T) * tangent.w正确生成,避免UV方向错误
参数设置:
_ShiftAmount1/2:控制主次高光的切线偏移量_Shininess1/2:控制主次高光的锐利程度_SpecColor1/2:设置主次高光的颜色
该实现通过将Kajiya-Kay模型的核心计算融入URP的标准BRDF框架,既保持了PBR工作流的兼容性,又实现了纤维材质特有的各向异性高光效果
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,)
【光照】[各向异性]在UnityURP中的实现的更多相关文章
- 关于Unity中的光照(七)
全局光照 GI 这里所说的反射就是,一个红色的物体,当太阳照射它的时候,它周围的物体也会变得有点红. 1:Realtime每帧都会计算光照,实时光照是不会反射的,所以它的光影显得单调;2:Baked ...
- Unity 5.6中的混合光照(上)
https://mp.weixin.qq.com/s/AbWM21sihHw5pFdMzENDPg 在Unity 5中,光照得到了很大的改进.现在,创建高度逼真的游戏已成为可能.但是,出于对性能的考虑 ...
- 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...
- [WebGL入门]二十五,点光源的光照
注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明.我会加上[lufy:].另外,鄙人webgl研究还不够深入,一些专业词语.假设翻译有误,欢迎大家指 ...
- Unity Shader入门精要学习笔记 - 第9章 更复杂的光照
转载自 冯乐乐的<Unity Shader入门精要> Unity 的渲染路径 在Unity里,渲染路径决定了光照是如何应该到Unity Shader 中的.因此,如果要和光源打交道,我们需 ...
- WebGL学习笔记(八):光照
局部光照与全局光照 局部光照 只考虑光源到模型表面的照射效果,运算量较小: 全局光照 考虑到环境中所有表面和光源相互作用的照射效果,即让没有直接受光照射的位置也会受周围反射光的影响,运算量较大: Ph ...
- 【Unity Shader】---基础光照
一.[标准光照模型]1.自发光emissve:描述一个表面本身会发散多少光.在没有使用全局光照时,这些自发光是不会真正照亮周围物体. 自发光就是直接由发光体发射进入摄像机,不经过任何反射,在标准光照模 ...
- 剖析虚幻渲染体系(15)- XR专题
目录 15.1 本篇概述 15.1.1 本篇内容 15.1.2 XR概念 15.1.2.1 VR 15.1.2.2 AR 15.1.2.3 MR 15.1.2.4 XR 15.1.3 XR综述 15. ...
- EasyPR--开发详解(8)文字定位
今天我们来介绍车牌定位中的一种新方法--文字定位方法(MSER),包括其主要设计思想与实现.接着我们会介绍一下EasyPR v1.5-beta版本中带来的几项改动. 一. 文字定位法 在EasyPR前 ...
- 基于暗通道优先算法的去雾应用(Matlab/C++)
基于暗通道优先的单幅图像去雾算法(Matlab/C++) 算法原理: 参见论文:Single Image Haze Removal Using Dark Channel Pri ...
随机推荐
- Economics-Industries-Chemical: 化工+材料 行业 : 海外化工巨头的一步步强大
一文详解:海外化工巨头的一步步强大 详解美国Dow&Dupont.美国3M.德国BASF.Covestro四大海外巨头材料企业, 他们的公司起源.发展历史和竞争战略,提炼企业特征和行业的共性. ...
- SciTech-BigDataAIML-NLP- 分词之 BPE | WordPiece | Unigram | SentencePiece 以及 sentencepiece原理与实践
https://github.com/google-research/retvec: BERT,XLNET分词方法bpe,wordpiece, unigram, sentencepiece 等介绍 h ...
- 官方文档没告诉你的:通过抓包,深入揭秘MCP协议底层通信
大家好,今天我们来深入探讨一个很有意思的话题--MCP(Model Context Protocol). MCP 是Anthropic发起的一种开放协议,旨在标准化应用程序向大型语言模型(LLM)提供 ...
- Win10专业版系统如何更改盘符的问题
很多深度系统的win10专业版用户,喜欢追求自己的个性化,想要把盘符修改成自己想要的名字,这样显的非常的有个性.那么,win10系统该如何修改盘符呢?别担心,深度技术小编就来分享详细的设置方法,有喜欢 ...
- unity 2d 发光特效
2d发光效果:可用于特效发光https://www.bilibili.com/video/av327594822?zw
- IntelliJ IDEA插件IDE Feature Trainer
这个插件就是个关于IDEA的一些基础快捷键教学,很多快捷键都还没有,比如Ctrl+Alt+← 编辑器基础(Editor Basics) 选择,删除,复制,移动行,收缩和展开代码. Ctrl+Shift ...
- HTTP请求头中表示代理IP地址的属性及获取情况
博客:https://www.emanjusaka.com 公众号:emanjusaka的编程栈 by emanjusaka from https://www.emanjusaka.com/archi ...
- 蓝海讯通OneAPM产品简介
简介:蓝海通讯OneAPM产品是一款端对端的应用性能监控工具:也即是针对应用程序和网站的性能监控工具: 解决问题:用户无法注册了?接口突然失效了?应用一再崩溃,APP Store 全是负面评价?没有靠 ...
- 餐饮服务与软件创新的融合:解析海底捞 APP 的 Flutter 鸿蒙开发之路
在鸿蒙生态快速发展的背景下,作为餐饮行业数字化先锋的海底捞,其鸿蒙版应用集成在线排队.点餐等核心功能,覆盖全国超千家门店.自2024年4月海底捞与华为达成合作意愿, 6月底全面启动开发工作,9月实现首 ...
- Casbin荣获2021年度“科创中国”开源创新榜优秀开源产品!
为了响应党中央.国务院高度重视开源软件发展的需求(国家软件发展战略将培育开源生态作为重点任务,国民经济和社会发展"十四五"规划和2035年远景目标纲要明确提出支持开源社区等创新联合 ...