找回密码
 立即注册
查看: 382|回复: 1

[笔记] URP核心代码学习

[复制链接]
发表于 2022-1-26 17:29 | 显示全部楼层 |阅读模式
本文翻译(或简要解释)UnityURP内部核心代码(或API),本篇更多是总结性的文字(比较枯燥),系统学习还是需要自行阅读源码理解
Core RP Library/ShaderLibrary

渲染管线底层核心代码。
API文件夹
定义了一些转成对应平台的方法。一般,图形学程序才会去看。
Sampling文件夹(采样)
内置了一系列图形学采样方法。

  • Fibonacci(斐波纳契,整数数列)
  • Hammersley(哈默斯利,利用计算机使用二进制表示的特性,来构造均匀分布的2D随机采样点)
  • SampleUVMapping(UV映射)
  • Sampling(采样工具包,如:Coordinate system conversion)
  • ShadowSamplingTent(PCF Filtering Triangle Filter(又名:Tent Filter)阴影工具包)
ACES
Academy Color Encoding System(ACES,Academy颜色编码系统)。
AreaLighting
区域(面积)光的数学方法。
BC6H
BC6H格式是一种纹理压缩格式,设计用于支持源数据中的高动态范围 (HDR) 颜色空间。
BSDF
【基于物理的渲染(PBR)白皮书】(三)迪士尼原则的BRDF与BSDF相关总结 - 毛星云的文章 - 知乎
Color
一系列(色彩空间)颜色转换的公式。
<hr/>Common(通用方法)


  • Unity的世界坐标系是:Y向上和左手坐标系(注意:当从世界空间到视图空间时,在视图空间中单位是右手的,并且矩阵的行列式是负的)。Cubemap捕获(反射探针)视图空间仍然是左手的(cubemap约定),行列式是正的。
  • 照明代码假设1单位(1uu) == 1米。
  • 不要使用“in”,只有“out”或“inout”作为califier,没有“inline”关键字,也没用。
  • 浮点数写成1.0(不是1,不是1.0f,不是1.0h)。
  • 来自ShaderLibrary的头文件不应该包含“common.hlsl”。它应该包含在使用它的.Shader(或Material.hlsl).
  • 所有uniforms都应该在常量缓冲区中(不应该在全局名称空间中)。
【内部实现API示例】

  • Common intrinsic(一些平台的内部的通用实现,如:BitFieldExtract)
  • Common math functions(数学方法,如:DegToRad)
  • Texture utilities(贴图工具,如:ComputeTextureLOD)
  • Texture format sampling(纹理格式采样方法:Latlong和Direction的Coordinate相互转换)
  • Depth encoding/decoding(深度编码/解码,如:Linear01Depth)
  • Space transformations(空间变换,如:ComputeClipSpacePosition)
  • PositionInputs(自带的一个Struct数据结构)
  • Terrain/Brush heightmap encoding/decoding(地形/刷heightmap编码/解码)
  • Misc utilities(其他常见的工具包)
CommonDeprecated(弃用方法)
它们在这里保持与以前版本的兼容性。
<hr/>CommonLighting

光照公约:光的方向是向后的(-Z)。例如,在着色器代码中,光的方向是-lightData.forward

  • Helper functions(一些立方体贴图的公式)
  • Attenuation functions(光源衰减函数)
  • IES Helper(IES灯光贴图坐标采样)
  • Lighting functions(漫反射、阴影、水平遮蔽、镜面遮蔽等公式)
  • Helper functions(不同于上一个Helper functions,这里封装了一些数学方法,如:GetBSDFAngle)
<hr/>CommonMaterial

定义了一些常量,部分常量:被应用于clear coat properties(不能被储存在Gbuffer的属性,比如:Lit shader)

  • Helper functions for roughness(粗糙度工具包)
  • Helper for Disney parametrization(迪斯尼参数化,计算漫反射和菲涅尔颜色的计算公式)
  • Helper for normal blending(法线混合公式)
  • Helper for triplanar(三维映射公式)
  • Helper for detail map operation(细节映射操作: LerpWhiteTo)
<hr/>CommonShadow
就只有一个方法GetShadowPosOffset:根据表面法线计算阴影地图采样时使用的偏移量。
Debug
调试工具包。
EntityLighting
球谐光照、GI、光照贴图的工具包。
Filtering

  • BSpline(继承bezier曲线发展的数学曲线)
  • Bicubic图像插值
  • 二阶滤波器(BiquadraticFilter)
GeometricTools
几何学工具包。

  • Transform functions(只包含旋转)
  • SolveQuadraticEquation(解:形式为:a*t^2 + b*t + c = 0的二次方程)
  • Intersection functions(射线碰撞检测,如:RaySphere)
  • Miscellaneous functions(杂项工具)
<hr/>ImageBasedLighing

基于图形的光照。

  • Util image based lighting(获取mipmap等级,如:基于感官粗糙度获取正确的mip级别)
  • Anisotropic image based lighting(各向异性)
  • Importance sampling BSDF functions(多重重要性采样)
  • Pre-integration(预积分)
<hr/>Macros
定义了很多宏(指令)。
这些宏的目的是:一些shader编译器不支持在同一个宏中做多个##连接,它需要一个间接的连接。
NormalSurfaceGrandient
GPU上的凹凸映射非参数曲面。
Packing
HLSL的pack和Unpack规则。
PerPixelDisplacement
视差遮挡贴图(POM)的实现。
PhysicalCamra
实现基于物理的相机。
Random
随机数工具包。
Refraction
折射工具包。
SDF2D
SDF(Signed Distance Field,有向距离场)
SpaceFillingCurves
对空间进行填充的曲线工具包。
SpaceTransforms
常见的空间转换函数工具包,如:TransformObjectToWorldNormal。
Tessellation
镶嵌工具包。
UnityInstancing
包括UnityInstancing的一些设置和实例属性数组。
Version
比较SHADER_LIBRARY_VERSION的版本大小方法。

  • #define SHADER_LIBRARY_VERSION_MAJOR 7
  • #define SHADER_LIBRARY_VERSION_MINOR 3
<hr/>VolumeRendering
立体渲染工具包,大部分都在计算透光率(Transmittance)、光学厚度(OpticalDepth)。

  • Deep Pixel Compositing(提高性能和数值稳定性)
  • Homogeneous Participating Media(均匀参与介质)
  • Height Fog(高度雾工具包)
  • Phase Functions(一个散射到某一个方向的概率分布函数,理解起来类似 BRDF)
  • Importance Sampling (一些重要的采样方法)
  • Miscellaneous(杂项)
<hr/>Universcal RP/ShaderLibrary

Core(必读)

记录了一些常见方法和自带了结构体(VertexPositionInputs和VertexNormalInputs)。

  • GetVertexPositionInputs
  • GetVertexNormalInputs
  • GetCameraPositionWS(_WorldSpaceCameraPos)
  • GetScaledScreenParams(_ScaledScreenParams)
  • AlphaDiscard(ALPHATEST开启后的cilp操作)
  • NormalizeNormalPerVertex(法线归一化)
  • Fog小工具包(MixFog、ComputeFogIntensity、ComputeFogFactor)
<hr/>DeclareDepthTexture
处理深度贴图的函数。
DeclareOpaqueTexture
处理不透明贴图的函数。
Deprecated(弃用方法)
它们在这里保持与以前版本的兼容性。
Input(必读)
一些常量的封装和翻译,如UNITY_MATRIX_M -> unity_ObjectToWorld。
<hr/>Lighting(必读)

光照公式。

  • Light Helpers (提供了一个抽象光(阴影)数据结构)
  • Attenuation Functions(衰减函数)
  • Light Abstraction (获取主灯光、逐对象灯光)
  • Structured Buffer Path(灯光和灯光索引存储在StructuredBuffer中。我们可以索引它们。目前所有的非移动平台都采用这种路径。移动GPU使用SSBO有限制(性能/没有顶点着色器支持)
  • UBO path(由于内存对齐,unity不支持int[]或float[],在float4 unity_LightIndices[2]中存储了8个灯光指数)
  • BRDF Functions (BRDF工具包)
  • Global Illumination(全局光照工具包)
  • Lighting Functions(一些光照模型,如:兰伯特、基于物理、镜面)
  • Fragment Functions(提供给ShaderGraph和其它Build-in渲染器用的方法)
<hr/>MetaInput
UnityMetaPass(为光照贴图和动态GI提取表面信息的Pass块)。
ShaderGraphFunctions
翻译ShaderGraph内置函数的工具包。
<hr/>Particles(必读)

粒子相关功能。

  • MixParticleColor(颜色混合片段函数)
  • SoftParticles(根据背景像素的深度返回褪色粒子的alpha值)
  • CameraFade(根据相机距离返回褪色粒子的alpha值)
  • AlphaModulate(开启_ALPHAMODULATE_ON或_ALPHAPREMULTIPLY_ON,进行透明度调节)
  • Distortion(变形,又称:扰动)
  • BlendTexture(采样一个纹理,如果需要的话,为纹理表动画做混合)
  • SampleNormalTS(在正切空间中采样一个法线映射)
<hr/>Shadows(必读)


  • 提供了阴影的内置参数,如:_CascadeShadowSplitSpheres0,_MainLightShadowOffset0。
  • 提供了阴影采样数据格式ShadowSamplingData和采样(ShadowMap)方法。
struct ShadowSamplingData
{
    half4 shadowOffset0;
    half4 shadowOffset1;
    half4 shadowOffset2;
    half4 shadowOffset3;
    float4 shadowmapSize;
};<hr/>SurfaceInput
一些材质球参数的工具包。
struct SurfaceData
{
half3 albedo;
half3 specular;
half  metallic;
half  smoothness;
half3 normalTS;
half3 emission;
half  occlusion;
half  alpha;
};UnityInput(必读)
内置参数。
<hr/>Universal RP/Shaders

Lit

Unity通用渲染管线的Lit.shader - 徒花的文章 - 知乎
发表于 2022-1-26 17:34 | 显示全部楼层
Mark
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-4-28 16:25 , Processed in 0.100941 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表