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)相关推荐

  1. 深入URP之Shader篇8: SimpleLit Shader分析(4)

    Simple Lit Forward Pass 本篇继续 Fragment shader 函数 InitializeInputData InputData inputData; InitializeI ...

  2. 深入URP之Shader篇3: Unlit Shader分析[下]

    Unlit shader 上篇中我们分析了Unlit shader的Properties在ShaderGUI中的处理,接下来看Sub Shader. SubShader unlit shader以及其 ...

  3. UI优化策略-Shader篇

    原文:https://zhuanlan.zhihu.com/p/33458843 前言 优化本身是一件琐碎且耗神的事情,需要经历问题定位.原因探查.优化方案设计和实现.效果验证.资源修改多个步骤,也会 ...

  4. 【Unity3D Shader编程】之五 圣诞夜篇 Unity中Shader的三种形态对比 混合操作合辑

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  5. 【shader】UE4 Subsurface Profile shader提取

    尝试把UE4里面的人像提取出来(因为无法直接获得UE4使用的shader代码),这个文章是基于UE4使用的sss.此外还有其他的sss呈现方式. 原作连接https://docs.unrealengi ...

  6. 【Unity3D Shader编程】之十三 单色透明Shader 标准镜面高光Shader

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/50878538 作者:毛星云(浅 ...

  7. 【Unity3D Shader编程】之十三 单色透明Shader 标准镜面高光Shader

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  8. shader 获取法线_Unity Shader 入门到改行5——法线贴图

    the best of blur 1. 法线贴图理论 1.1 什么是法线贴图 一般的贴图中存储的是表面颜色值(RGBA),而法线贴图存放的则是法线信息(xyzw),假设某顶点处的 uv 坐标为 (u, ...

  9. 关于Unity 5.x Lightmap Shader 编译过慢的分析

    关于Unity 5.x Lightmap Shader 编译过慢的分析 缘起 最近在研究Unity 5.x 的 Lightmapping 与 场景打包的相关的知识.发现坑深啊.关于怎么打包怎么用网上的 ...

最新文章

  1. Python基础,Hello,world
  2. 【Android 应用开发】Android应用的自动更新模块
  3. 阅读准备-构建redis容器
  4. Spring MVC的异步模式DefferedResult
  5. 左神算法:调整搜索二叉树中两个错误的节点(Java版)
  6. Android之OKHttp使用总结
  7. 跟我学 Java 8 新特性之 Stream 流基础体验
  8. 教师计算机excel培训教案,Excel培训教案..doc
  9. 问题 B: 调整表中元素顺序(线性表)
  10. 《C程序员从校园到职场》一2.2 破除错误观念
  11. linux下proc目录部分说明
  12. DB2 查看表空间使用率
  13. c语言输出中文为乱码_C语言输出乱码问题
  14. 基于openoffice+pdfobject.js实现文档上传以及在线预览功能
  15. 去除Ubuntu 20桌面图标的快捷方式箭头
  16. Excel查找一列中的相同值,删除该行或替换为空值
  17. MSDC 4.3 接口规范(14)
  18. google 卫星地图
  19. 纹身时应该注意的一些事项
  20. AD那些事 切割板子形状,线的弧度转换

热门文章

  1. 敏捷简介:什么是敏捷开发?
  2. 不偏移的天地图地图服务-ArcGIS版
  3. 2020-03-22阅读笔记-考虑遗忘机制的企业隐性知识传播SIR模型研究
  4. SpringCloud中Client向Eureka注册中心注册服务成功后不久就Unregistering(Unregistering application 服务名 with eureka with)
  5. 苏格拉底与柏拉图麦穗的故事
  6. 接待员如何向客人upsell_商务礼仪之接待客人细节
  7. EGE基础入门篇(八):清屏与重绘
  8. 知乎高赞 20 款网页神器
  9. Springboot中国古代史在线学习网站毕业设计源码260839
  10. 新浪微博SDK抛出异常-[__NSDictionaryM weibosdk_WBSDKJSONString]: