深入URP之Shader篇5: SimpleLit Shader分析(1)
SimpleLit.shader
本篇开始分析simple lit shader。我们通过分析unlit shader了解了URP shader的结构,以及一些基础功能。而simple lit shader包含了更多的内容。本篇开始,就不会特别仔细的逐行去分析shader文件了,只会针对pass的功能中比较有意思且之前没看到过的内容进行分析。
ForwardLit
名字为ForwardLit
的pass,它的Tags为:
Tags { "LightMode" = "UniversalForward" }
根据URP的文档:
UniversalForward : The Pass renders object geometry and evaluates all light contributions. URP uses this tag value in the Forward Rendering Path.
说明这是一个前向渲染路径的pass,虽然URP(至少是10.8.1版本)还没有正式支持Deferred Rendering,但URP已经为它打了很多基础,所以会特意标明这个pass是前向渲染还是延迟渲染,如果是延迟渲染则会使用LightModeUniversalGBuffer
,SimpleLit shader也有这个pass,但是暂时不会研究它。
支持的关键字
看一下ForwardLit支持的关键字,就可以大概看出实现了哪些功能,当然本身的功能就是光照不必说。
// -------------------------------------// Material Keywords#pragma shader_feature_local_fragment _ALPHATEST_ON#pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON#pragma shader_feature_local_fragment _ _SPECGLOSSMAP _SPECULAR_COLOR#pragma shader_feature_local_fragment _GLOSSINESS_FROM_BASE_ALPHA#pragma shader_feature_local _NORMALMAP#pragma shader_feature_local_fragment _EMISSION#pragma shader_feature_local _RECEIVE_SHADOWS_OFF// -------------------------------------// Universal Pipeline keywords#pragma multi_compile _ _MAIN_LIGHT_SHADOWS#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS#pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS#pragma multi_compile_fragment _ _SHADOWS_SOFT#pragma multi_compile _ LIGHTMAP_SHADOW_MIXING#pragma multi_compile _ SHADOWS_SHADOWMASK#pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION// -------------------------------------// Unity defined keywords#pragma multi_compile _ DIRLIGHTMAP_COMBINED#pragma multi_compile _ LIGHTMAP_ON#pragma multi_compile_fog//--------------------------------------// GPU Instancing#pragma multi_compile_instancing#pragma multi_compile _ DOTS_INSTANCING_ON
可以看到,这些关键字分了几类。比如Material Keywords
都是使用shader feature定义的,这些是材质上可以开关选择的关键字,比如我们之前看到过的alpha test, alpha premultiply;而simpeLit增加的有Specular GlossMap/Specular Color, Normalmap, Emission以及ReceiveShadowsOff,除了最后一个,都是和计算光照相关的选项,涉及到高光,法线贴图和自发光,我们会在shader里面看到它们的实现。
而Universal Pipeline keywords
这一组则是URP的一些全局设置相关的,这里的全局只是相对于材质来说,也不是local/global keywords那个全局。比如_MAIN_LIGHT_SHADOWS
决定了是否使用主光阴影,_MAIN_LIGHT_SHADOWS_CASCADE
是是否主光阴影使用级联阴影。Additional Lights相关的关键字是控制附加灯相关的光照和阴影。Lightmap shadow mixing和shadow mask是Unity的混合光照相关。
Unity defined keywords
这一组顾名思义就是Unity定义的关键字了,比如lightmap开关和深度雾。
此外还有GPU Instancing
这组。
引用的HLSL
#include "Packages/com.unity.render-pipelines.universal/Shaders/SimpleLitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/SimpleLitForwardPass.hlsl"
这也是URP的惯例了,一个Pass自身的hlsl代码分为Input和Pass两部分。
SimpleLitInput.hlsl
在分析unlit shader时,我没有太关注unlit input,但是这次我打算详细的分析一下了。
SimpleLit input hlsl包含了shader使用的uniform的定义,uniform可能是以CBuffer的形式定义,也可能是shader全局变量的形式。使用CBUffer形式的往往是为了兼容SRPBatcher或者Instancing,打包进CBuffer的uniform往往是要经常变化的,比如随材质变化或者随instance变化;而全局变量的uniform就是全局改变的。
有几个内容需要关注:
- SRP Batcher相关的CBuffer
- Instancing相关的CBuffer
- 什么是DOTS Instancing
相关内容篇幅会比较大,因此会分为几篇,以SimpleLit Shader为例子说明。
SimpleLitForwardPass.hlsl
这个文件就是SimpleLit前向渲染pass的主要代码了。首先它一开始就引用了"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
文件,这个文件非常重要,值得好好研读。这里面几乎包含了URP光照相关的全部shader库了,在相关shader引用到里面的内容时会做说明。回到SimpleLit,定义了如下的顶点属性:
struct Attributes
{float4 positionOS : POSITION;float3 normalOS : NORMAL;float4 tangentOS : TANGENT;float2 texcoord : TEXCOORD0;float2 lightmapUV : TEXCOORD1;UNITY_VERTEX_INPUT_INSTANCE_ID
};
坐标,法线,切线,两套uv,基本全了,毕竟要算光照都不能少,除了没用顶点色。再看VS的输出以及FS的输入:
struct Varyings
{float2 uv : TEXCOORD0;DECLARE_LIGHTMAP_OR_SH(lightmapUV, vertexSH, 1);float3 posWS : TEXCOORD2; // xyz: posWS#ifdef _NORMALMAPfloat4 normal : TEXCOORD3; // xyz: normal, w: viewDir.xfloat4 tangent : TEXCOORD4; // xyz: tangent, w: viewDir.yfloat4 bitangent : TEXCOORD5; // xyz: bitangent, w: viewDir.z
#elsefloat3 normal : TEXCOORD3;float3 viewDir : TEXCOORD4;
#endifhalf4 fogFactorAndVertexLight : TEXCOORD6; // x: fogFactor, yzw: vertex light#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)float4 shadowCoord : TEXCOORD7;
#endiffloat4 positionCS : SV_POSITION;UNITY_VERTEX_INPUT_INSTANCE_IDUNITY_VERTEX_OUTPUT_STEREO
};
VS输出啥其实是看FS的计算需要啥,首先uv, 世界坐标,法线,视线方向等计算Blinn-Phong模型光照所需的经典角色一个不少;如果启用了法线贴图,还需要输出切线坐标系;另外似乎还有所谓的vertex light;当然clip sapce postition是必须的。
本篇总结
由于篇幅所限,本篇只是起了个头,结果挖了好几个坑。至少我们现在对SimpeLit的功能有了大体的了解,光照部分应该是使用了Blinn-Phong模型,支持法线贴图。下篇将继续分析前向渲染路径的光照。之后会有几篇介绍SRP Batcher和Instancing。然后是Shadow Caster等等。基本上一个SimpleLit就可以挖出很多东西了。
深入URP之Shader篇5: SimpleLit Shader分析(1)相关推荐
- 深入URP之Shader篇8: SimpleLit Shader分析(4)
Simple Lit Forward Pass 本篇继续 Fragment shader 函数 InitializeInputData InputData inputData; InitializeI ...
- 深入URP之Shader篇3: Unlit Shader分析[下]
Unlit shader 上篇中我们分析了Unlit shader的Properties在ShaderGUI中的处理,接下来看Sub Shader. SubShader unlit shader以及其 ...
- UI优化策略-Shader篇
原文:https://zhuanlan.zhihu.com/p/33458843 前言 优化本身是一件琐碎且耗神的事情,需要经历问题定位.原因探查.优化方案设计和实现.效果验证.资源修改多个步骤,也会 ...
- 【Unity3D Shader编程】之五 圣诞夜篇 Unity中Shader的三种形态对比 混合操作合辑
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
- 【shader】UE4 Subsurface Profile shader提取
尝试把UE4里面的人像提取出来(因为无法直接获得UE4使用的shader代码),这个文章是基于UE4使用的sss.此外还有其他的sss呈现方式. 原作连接https://docs.unrealengi ...
- 【Unity3D Shader编程】之十三 单色透明Shader 标准镜面高光Shader
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/50878538 作者:毛星云(浅 ...
- 【Unity3D Shader编程】之十三 单色透明Shader 标准镜面高光Shader
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
- shader 获取法线_Unity Shader 入门到改行5——法线贴图
the best of blur 1. 法线贴图理论 1.1 什么是法线贴图 一般的贴图中存储的是表面颜色值(RGBA),而法线贴图存放的则是法线信息(xyzw),假设某顶点处的 uv 坐标为 (u, ...
- 关于Unity 5.x Lightmap Shader 编译过慢的分析
关于Unity 5.x Lightmap Shader 编译过慢的分析 缘起 最近在研究Unity 5.x 的 Lightmapping 与 场景打包的相关的知识.发现坑深啊.关于怎么打包怎么用网上的 ...
最新文章
- Python基础,Hello,world
- 【Android 应用开发】Android应用的自动更新模块
- 阅读准备-构建redis容器
- Spring MVC的异步模式DefferedResult
- 左神算法:调整搜索二叉树中两个错误的节点(Java版)
- Android之OKHttp使用总结
- 跟我学 Java 8 新特性之 Stream 流基础体验
- 教师计算机excel培训教案,Excel培训教案..doc
- 问题 B: 调整表中元素顺序(线性表)
- 《C程序员从校园到职场》一2.2 破除错误观念
- linux下proc目录部分说明
- DB2 查看表空间使用率
- c语言输出中文为乱码_C语言输出乱码问题
- 基于openoffice+pdfobject.js实现文档上传以及在线预览功能
- 去除Ubuntu 20桌面图标的快捷方式箭头
- Excel查找一列中的相同值,删除该行或替换为空值
- MSDC 4.3 接口规范(14)
- google 卫星地图
- 纹身时应该注意的一些事项
- AD那些事 切割板子形状,线的弧度转换
热门文章
- 敏捷简介:什么是敏捷开发?
- 不偏移的天地图地图服务-ArcGIS版
- 2020-03-22阅读笔记-考虑遗忘机制的企业隐性知识传播SIR模型研究
- SpringCloud中Client向Eureka注册中心注册服务成功后不久就Unregistering(Unregistering application 服务名 with eureka with)
- 苏格拉底与柏拉图麦穗的故事
- 接待员如何向客人upsell_商务礼仪之接待客人细节
- EGE基础入门篇(八):清屏与重绘
- 知乎高赞 20 款网页神器
- Springboot中国古代史在线学习网站毕业设计源码260839
- 新浪微博SDK抛出异常-[__NSDictionaryM weibosdk_WBSDKJSONString]: