Unity中的阴影
Unity中的阴影设置Qulity面板
ShadowmaskMode设置分为Shadowmask和DistanceShadowMask,如果设置为DistanceShadowMask将会采用在ShadowDistance内使用实时阴影取代光照贴图,避免阴影贴图中的阴影无法影响动态物体,当然这会有性能上的消耗,最好通过LightProbe解决这一问题
Shadows设置分为DisabledShadows,HardShadowOnly和HardAndSoftShadows,字面意思就是无阴影,只支持硬阴影和都支持,测试下来无阴影确实不会产生,但是HardShadowOnly和HardAndSoftShadows都能产生软阴影
Shadow Resolution设置分为Low、Medium、High 和 Very High,这会影响到ShadowMap的分辨率,分辨率越高,阴影质量越好,性能开销也越大
Shadow Projection设置分为CloseFit和StableFit, Close Fit 可以渲染出更高分辨率的阴影,但如果摄像机移动,它 ...
伽马空间和线性空间
伽马空间和线性空间的区别和作用线性空间 在物理世界中,光强增加一倍亮度也增加一倍,呈线性关系,物理世界中的颜色和光照规律都是在线性空间描述的。计算机图形学是物理世界视觉的数学模型,Shader中颜色插值、光照的计算自然也是在线性空间描述
伽马空间 伽马空间实际是对RGB的数值进行一次Pow操作,如果是Pow(x,0.45)则为Gamma0.45空间,也可称之为伽马矫正如果是Pow(x,2.2)则为Gamma2.2空间,也可称之为逆伽马矫正,一次伽马一次逆伽马叠加正好是线性空间结果
由于人眼对于亮度变化的感知不是线性的,对于暗色调更敏感,我们应该用更大的数据范围来寸暗色调,用较小的数据范围存亮色调,对于这个需求,可以观察到Gama0.45的曲线是符合的,然后在显示器这边对输入的信号进行一次逆伽马矫正,这样最终显示结果是真实的线性空间表现,颜色存储是按Gamma0.45进行的。
材质的空间 当前业界中常用的sRGB格式就是存储在Gamma0.45空间的,Unity中sRGB的勾选应该选上。而NormalMap、噪声、Mask、LightMap等其他计算 ...
GAMES202笔记-作业1
作业1主要是对GAMES202-Lecture3中的知识进行应用,涉及到了ShadowMap生成、基本硬阴影绘制、PCF、PCSS等知识
ShadowMap生成作业中对于ShadowMap的生成,仅要求书写模型空间到光源空间的MVP矩阵的书写
对于modelMatrix,我们能获得的参数有模型的Scale和Translate,没有旋转相关参数,我们按照模型变换顺序先进行Scale的矩阵变换然后进行TransLate的矩阵变换,得到modelMatrix。对于viewMatrix,我们能获得的参数有观察点和光源位置以及光源的Up向量,根据观察点和光源位置我们可以确定view的朝向,然后将光源的Up向量与朝向进行正交化并叉乘得到第三个基向量,将三个基向量正交化并对组成的矩阵取逆得到viewMatrix(由于z轴正方向和摄像机正反向是反的,viewMatrix需要对朝向向量取反)。对于projectionMatrix,我们采用正交变换,但这边没有参数,只能是根据给到的参数进行推测,根据正交变换实际是一次平移加上缩放获得变换矩阵。
1234567891011121314151617181920 ...
GAMES202笔记-Lecture3
阴影生成原理生成阴影一般采用对场景进行两次渲染的方法,第一次是让摄像机从光源位置看向场景进行渲染,这次渲染只记录深度信息,生成ShadowMap,第二次是进行真正的渲染,在渲染过程中会将当前顶点转换到第一次渲染的光源空间,进行深度采样并与当前的深度进行对比,如果当前深度大于ShadowMap记录的深度,说明物体被遮挡,则产生阴影
阴影背后的数学原理微积分中有如下不等式
考虑Shading Point会不会接受四面八方的光照时,渲染方程如下
即Wo方向的反射光合集是所有间接光经过BRDF反射到Wo方向的可见光
结合以上约等式和渲染方程可以得到
也就是说Visibility可以被单独拆开考虑,最后乘以Shading计算结果即可,和ShadowMap的思路是一致的
约等式成立的条件为:
g(x)积分范围很小,也就是渲染方程中的dwi范围很小时,在点光源和方向光源中只有一个点和一个方向有光照是准确的
当g(x)平滑时,也就是渲染方程中Shading的结果是平滑的时,在Shading计算是diffuse(各个方向Shading一致)或者面光源(每个点视为相同点光源)是准确的
Shad ...
光照系统
光照类型
平行光:类似于太阳光,平行光没有距离概念,不会衰减,不考虑遮挡,对于空间中的任意点接收到的平行光的方向、强度都是一样的
点光源:相较于平行光,点光源是有位置概念的,点光源的位置会影响,接收光照的点的方向和强度
聚光灯:相较于点光源,聚光灯相当于是点光源的一部分,聚光灯多了一个朝向的概念,点光源的范围是球形的,聚光灯的范围是朝着聚光灯朝向的锥形
光照衰减 随着距离的增加,光照的强度会不断衰减,在Unity中点光源我们可以自己计算,但是对于聚光定由于要考虑聚光灯的朝向、张角等信息而Unity在当前版本不能通过Shader获取这些信息(也可能现在提供了,参考入门精要是没有),只能通过脚本进行数据传递,但是Unity提供了光照衰减纹理,可以直接采样获取到衰减值,主要原理是在材质上按照光源空间的不同位置存储,在采样时将要着色的点转到光源空间进行衰减值采样,这样可以大大减少光照衰减的计算量
代码如下:
#if defined(POINT) //点光源
float3 lightCoord = mul(unity_WorldToLight, float4(i.wo ...
深度图
深度是个非常重要的信息,反映物体离屏幕的远近,利用好深度可以实现许多效果,Unity中存储了一张屏幕空间中的深度图,我们将要分析该图的是如何产生以及如何进行应用
屏幕空间深度深度图中存储的就是屏幕空间深度值,范围为0 - 1。当在近裁面时,depth = 0,当在远裁面时depth = 1。我们可能会猜想 depth从视空间经过透视变换后公式为depth = (Z(eye) - N) / (F - N),这样深度就是线性从0 - 1变化了,但是我们根据此公式得出深度后在屏幕空间进行插值后并不能保证对应的点在投影前的空间是线性变化的,如下如图,C1F1和F1E1在裁剪面投影大小一致,但是实际距离差距很大
实际上透视投影后,在屏幕空间进行插值的数据和1/Z成正比 Depth = (aZ + b) / Z ,将Z = N ,Depth = 0 以及 Z = F ,Depth = 1带入可以解得 a = F / (F - N),b = NF / (N - F) ,最终获得 depth = (F / (F - N) * Z + NF / (N - F)) / Z (也可以通过投影公式推倒得出) ...
法线贴图
法线贴图的主要原理是改变贴图的法线从而改变物体的颜色变化,产生一种凹凸感,我们需要弄明白如何将法线进行改变
重要概念
法线贴图:由于需要对物体的法线进行改变,我们需要对改变的法线进行存储,贴图用RGB存储颜色,法线贴图用RGB存储法线方向
切线空间:切线空间主要用于法线贴图的坐标系确立,由于物体在世界坐标系是不断变化的,我们没法使用世界坐标系作为法线贴图的坐标系,需要建立一个可以确认物体某个点的法线是固定不变的坐标系,这样我们才能对法线做出正确的变换。我们将物体的法线(N),顶点的切线(T)以及法线切线叉乘确认的副切线(B)作为形成的[T,B,N]矩阵作为切线空间的坐标系,而法线贴图的法线就是定义在这个坐标系下的
顶点切线、副切线的获取:三个顶点构成的平面和切线副切线的平面是共面的,如下图,而顶点坐标都是已知的,我们可以推倒出切线,副切线,Unity中会将切线信息存储在顶点中,副切线通过叉乘获得 具体推倒过程
正交基与坐标系转换: TBN矩阵的每个向量都需要进行归一化形成正交基,正交基的特点是每个基向量都是单位向量且相互垂直,这样的矩阵有个好处是逆矩阵和转置矩阵是一致的。向量计 ...