渲染基础概念 unity shader 材质相关学习
Posted 长虹剑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了渲染基础概念 unity shader 材质相关学习相关的知识,希望对你有一定的参考价值。
文章目录
学了unity shader 明白一件事情,之前学习的 opengl 渲染管线,以及写过的 z-buffer 纯纯让自己陷入了渲染引擎的局部。 还不如看看 shader 语法,这样能够了解渲染的关键部分,以及通用对象,很多之前看不懂了,不知道为啥那么做的,现在一下子就懂了。 就是不学之前以为学的要很多,学了之后知道才知道框架基本是固定的,真正要学的是里面的创意,以及如何写才能高效。
渲染基础知识
最好读一下 《Real time rendering》和 《learning opengl 》 学一些基础知识
FB0
帧缓存对象, 其实最长用的用途就是 后处理, 先渲染到这里,然后做后处理,最后作为整个贴图渲染到屏幕
延迟渲染
在正向渲染中照亮一个片段所需要的所有数据:
一个3D位置向量来计算(插值)片段位置变量供lightDir和viewDir使用
一个RGB漫反射颜色向量,也就是反照率(Albedo)
一个3D法向量来判断平面的斜率
一个镜面强度(Specular Intensity)浮点值
所有光源的位置和颜色向量
玩家或者观察者的位置向量
但是想象一下如果有多个光源怎么办,那不得调用多次吗? 这就要用延迟渲染了
延迟着色法基于我们延迟(Defer)或推迟(Postpone)大部分计算量非常大的渲染(像是光照)到后期进行处理的想法。它包含两个处理阶段(Pass):在第一个几何处理阶段(Geometry Pass)中,我们先渲染场景一次,之后获取对象的各种几何信息,并储存在一系列叫做G缓冲(G-buffer)的纹理中;如位置向量(Position Vector)、颜色向量(Color Vector)、法向量(Normal Vector)和/或镜面值(Specular Value)。场景中这些储存在G缓冲中的几何信息将会在之后用来做(更复杂的)光照计算。
光照立体角
描述从原点到球面区域张成的视野大小,可以对应平面的弧度:角度在单位圆上对应的弧长。
单位: sr, 表示球面度,也即立体弧度 == 球上的面积除以半径的平方
ω
=
s
/
r
2
ω= s/r^2
ω=s/r2.
d
ω
=
d
A
r
2
=
s
i
n
θ
d
θ
d
ϕ
d \\omega = \\fracdAr^2 = sin \\theta d \\theta d \\phi
dω=r2dA=sinθdθdϕ
其他就是把握 焦耳 J : Q -> 瓦特 W(单位时间J) :
Φ
\\Phi
Φ -> 每个球面度(W/sr) : I 发光强度
Radiance L: 这个主要是表示光亮度,是每单位立体角在每单位投影面积上的辐射通量,因为光源是有方向的,应该选择垂直于该方向的截面。
结合这个图看一下
投影面积描述了一个物体表面的微小区域在某个视线方向上的可见面积
注意上面不是平方,而是二阶导数。
Irradiance: 辐照度,辉度, 单位时间内到达单位面积的辐射通量
这个和 I 其实概念类似,不过E表示的是在投影面上的概念。
光照 BRDF
BRDF: 描述光如何从给定的两个方向(入射光方向l和出射方向v)在表面进行反射的函数。
考虑到入射和出射方向都拥有两个自由度(通常参数化是使用两个角度:相对于表面法线的仰角θ和关于法线的旋转角度φ),一般情况下,BRDF是拥有四个标量变量的函数。
但是各项同性BRDF 是三个,具体应该是输出时绕法线不变。
线性特征: 表面上某一点的全部反射辐射度可以简单地表示为各BRDF反射辐射度之和
也分为基于经验的,基于数据的,基于物理的
次表面散射: 光射入表面,在材质里散射,然后从与射入点不同的地方射出表面的一种现象。
菲涅尔反射:
sRGB, gamma 校正
(目前还没有仔细研究,因此也是猜测)
一般来说我们操作像素就是在线性空间,但是实际上这个亮度的变换与我们的直观不一致。
sRGB 规定图像更多空间用于存储暗部区域,来最大化利用表示亮度的数据。[注意这里主要说的是离散化存储的时候, 0.;45幂次]
而显示器显示的时候由于硬件原因会按照2.2次幂进行显示。也就是又变回去了。
(目前感觉不知道有什么重要性?毕竟不影响中间在线性空间颜色的操作,仅仅是离散化的时候更照顾灰度)
HRDP 着色器基础介绍
[https://baijiahao.baidu.com/s?id=1713339702599327160](Metallic vs Specular 两套工作流程)
SSS Subsurface scattering
里面有 mask map
R: metallic
G: Ambient occulation
B: Detail Mask
A: smoothness
SSSS Screen-Space-Subsurface-Scattering
似乎需要一个 diffusion profile , 来表达扩散程度
bgfx
基础知识
uniform
统一数据类型
shader调用时,首先创建一个名字,然后
sc 转 unity 的使用
可以参考下这个博客 https://www.jianshu.com/p/4eb04f76f9a8
nm='fs_sky_color_banding_fix'
#nm=vs_sky
$shaderc -f ./$nm.sc -o ./hlsl/$nm.hlsl --depends -i ../../src --varyingdef varying.def.sc --platform windows -p vs_5_0 --type $nm:0:1 --preprocess
批处理
shaderc=bin/shaderc.exe
ddir=.
for file in $ddir/*.sc
do
nm=`basename $file .sc`
echo $nm
if [[ ! "$nm" =~ ^[vf]s ]]; then
continue
fi
$shaderc -f $ddir/$nm.sc -o hlsl/$nm.hlsl --depends -i $ddir --varyingdef $ddir/varying.def.sc --platform windows -p vs_5_0 --type $nm:0:1 --preprocess
vim hlsl/$nm.hlsl -s clearcode.vim
done
unity 使用自定义HDRP
这个主要需要参考这个视频 https://www.youtube.com/watch?v=fiFZMTNM0E4 以及这个博客 https://zhuanlan.zhihu.com/p/170241589
主要是需要先建立一个
empty (gameobject) 设置一个 custo pass volume
然后注意 layer mask 需要自己在layer 中设置一下
然后还要建立材质,需要新建一个 HDRP custom renderers shader 这样些的代码才能用。
一些常用的结构体定义,注意宏定义可以决定具体内部使用哪些变量 https://blog.csdn.net/Calette/article/details/103592488
下面讲了一些全局变量
[https://zhuanlan.zhihu.com/p/137003449](Unity自定义可编程渲染管线(SRP)(六)——Shader)
[https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html](unity shader 参数)
Unity Shader 入门精要
https://www.bilibili.com/video/BV1sh41147zb
debug 方法: window-> analysis->frame debugger 用于查看渲染过程进行debug
基本的变量和基本 shader 的编写
a2v: application to vertice
标准光照模型
拆成四部分,分别用模型计算然后组合, ambient, emissive, diffuse, specular
_ST 纹理的缩放和平移属性
float4 TANGENT: 顶点的切线方向 , 4 是因为决定副切线的方向。
代码要考虑复用结构,这样可以减少计算之类的。
凹凸贴图那里,要知道得再物体坐标系下定义法向量,也叫切空间下的normal
https://juejin.cn/post/7056031676727558157
分割模型其实也是为了渲染顺序中好排序,或者凸面体。
alpha 测试
透明度混合需要关闭深度写入,
透明度混合, 两个 pass ,第一个先获得深度信息。
光照部分:
处理光照可以按照逐像素,逐顶点以及SH 处理。 渲染的时候按照重要程度排序,然后选择。
比如 unity 会这样设置 【我猜测这就是实时渲染引擎的重要之处】
延迟渲染:古老的,多一个缓冲,但是不支持真正的抗锯齿
game object 中有个 render cube
以上是关于渲染基础概念 unity shader 材质相关学习的主要内容,如果未能解决你的问题,请参考以下文章