URP核心代码学习
本文翻译(或简要解释)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中存储了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;
halfmetallic;
halfsmoothness;
half3 normalTS;
half3 emission;
halfocclusion;
halfalpha;
};UnityInput(必读)
内置参数。
<hr/>Universal RP/Shaders
Lit
Unity通用渲染管线的Lit.shader - 徒花的文章 - 知乎 Mark
页:
[1]