材质脚本控制
脚本中开启 HDR Color123456[GradientUsage(true)] //添加HDR类型的颜色条public Gradient Gradient;[ColorUsageAttribute(true, true)] //添加HDR类型的颜色public Color Color;
材质属性材质属性在 C# 代码中通过 MaterialProperty 类进行表示。
要访问 HLSL 代码中定义的变量,可以调用 Material.GetFloat、Material.SetFloat。还有其他类似的方法;请参阅材质 API 文档以获取完整列表。使用这些 API 访问 HLSL 变量时,变量是否为材质属性并不重要。
在 Unity 编辑器中,可以控制材质属性在 Inspector 窗口中的显示方式。为此,最简单的方法是使用 MaterialPropertyDrawer。对于更复杂的需求,可以使用 MaterialEditor、MaterialProperty 和 ShaderGUI 类。有关为着色器创建自定义 GUI 的更多信息,请参阅 ShaderLab:分配自定义编辑器。
...
描边
0 轮廓线渲染方法在 《RTR3》 中,作者分成了 5 种类型:
基于观察方向 $V$ 和表面法线 $N$ 。
通过观察方向和表面法线点乘结果来得到轮廓线信息。简单快速,但局限性大。
过程式几何轮廓线渲染:法线外拓 + Cull Front
核心是两个 Pass:
第一个 Pass 只渲染背面并且让轮廓可见(比如通过顶点外扩);
第二个 Pass 正常渲染正面。快速有效,适应于大多数表面平滑的模型,但不适合立方体等平整模型。
基于图像处理。
可以适用于任何种类的模型。但是一些深度和法线变化很小的轮廓无法检测出来,如桌子上一张纸。
基于轮廓边检测
上述方法无法控制轮廓线的风格渲染,例如水墨风格等,使用该方法可以进行风格化渲染。缺点是实现相对复杂,会有动画连贯性问题,因为是逐帧单独提取轮廓,所以帧与帧之间会出现跳跃性。
检测一条边是否是轮廓边的方法:检查这条边相邻的两个三角面片是否满足:$(n_0·v> 0) ≠ (n_1·v > 0)$。
$n_0$ 和 $n_1$ 表示两个相邻三角面片的法向,$v$ 是从视角到该边上任意顶点的方向。本质是检查相邻两个三 ...
数据结构
《王道数据结构》
第一章:绪论1.1 数据结构的基本概念1. 数据:数据是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机中并被程序识别和处理的符号的集合。
2. 数据元素:数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。例如,学生记录就是一个数据元素,它由学号、姓名、性别等数据项组成。
3. 数据对象: 数据对象是具有相同性值的数据元素的集合,是数据的一个子集。
4. 数据类型: 数据类型是一个值的集合和定义再此集合上的一组操作的总称。
原子类型。其值不可再分的数据类型。如 bool 和 int 类型。
结构类型。其值可以再分解为若干成分(分量)的数据类型。
抽象数据类型。抽象数据组织及与之相关的操作。(定义一个 ADT 就是定义了数据的逻辑结构,数据的运算,也就是定义了一个完整的数据结构)
5. 数据结构: 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
1.2 数据结构的三要素逻辑结构逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据。与数据的存储无关 ...
顶点动画
平移旋转缩放平移在顶点着色器中修改顶点位置的 xyz 值即可
缩放为了防止朝负方向缩放,+1.0 作为基础值,使原点永远乘以正值
1234void Scale(inout float3 vertex) { vertex.xyz *= 1.0 + _ScaleRange * sin(frac(_Time.z * _ScaleSpeed) * UNITY_TWO_PI); }
旋转12345678910111213141516171819// 旋转方法 void Rotate(inout float3 vertex) { //计算旋转角度 float angleY = _RotateRange * sin(frac(_Time.z * _RotateSpeed) * UNITY_TWO_PI); //角度转为弧度 float radY = radians(angleY); //sincos()方法节省性能,效果相同 //float sinY = sin(radY); / ...
【公式推导04】纹理映射
纹理坐标 uv纹理坐标采用的是归一化坐标区间 $[0,1]$对于每个 3D 三角形来说, 我们希望在将要映射于其上的纹理中定义出与之对应的三角形 :
设 $p_0$、$p_1$ 以及 $p_2$ 为 3D 三角形的 3 个顶点,它们分别对应于纹理坐标 $q_0$、$q_1$ 与 $q_2$。
针对 3D 三角形上任意一点 $(x, y, z)$ 处的纹理坐标 $(u,v)$,我们都可以通过与 3D 三角形坐标插值所用的相同参数 $s$、$t$,对顶点纹理坐标进行线性插值来求得。这就是说,如果:$$( x, y,z)= p = p_0 + s(p_1 - p_0)+ t(p_2 - p_0)$$当 $s\geqslant0,t\geqslant0,s+t\leq1$ 时,那么$$(u,v)=q=q_0+s(q_1-q_0)+t(q_2-q_0)$$
依此方法便可求出三角形上每个点处的对应纹理坐标。
环境光照IBL
1 环境光照原理环境光照就是在场景中任意一点往四周看去可看到的光照(距离视为无限远), 将其记录在一张图上存储。也叫做 **IBL (image-based lighing)**。通常我们用 Cube Map 和 Spherical Map 来存储环境光照,将贴图的每个像素当成一个光源。
Cube Map(左)p 和 Spherical Map(右),它们是可以通过算法转换的
如果已知环境光照, 此时放置一个物体在场景中间, 在不考虑阴影时我们该如何去得到任何一物体上着色点的 shading 值呢?
@ 首先要先来看渲染方程$$L_o(p,\omega_o) = \int\limits_{\Omega} f_r(p,\omega_i,\omega_o) L_i(p,\omega_i) n \cdot \omega_i d\omega_i$$通用的解法是使用蒙特卡洛积分去解, 但是蒙特卡洛需要大量的样本才能让得出的结果足够接近, 如果我们对每个 shading point 都做一遍蒙特卡洛积分,那样的话太慢了。
@ 如何避免采样?通过预滤波和预计算,完全避免采样! ...
辐射度量学
1 辐射度量学辐射度量学 (radiometry) 是研究光的辐射和传输过程的科学。它关注光的物理特性,如能量、亮度和颜色,并提供了一套用于描述和量化光的属性的数学工具和概念。
在计算机图形学中,辐射度量学着重讨论光的电磁横波中光学谱段的可见光谱的辐射能的计算。光学谱段范围值从波长 0.1 的红外线到 0.1nm 的 X 射线这一距离。可见光谱段指人眼产目视刺激从而形成光感和色感的谱段,范围大约为 0.38—0.76μm。
辐射度量学 (Radiometry) 是一种用来度量电磁场辐射(包括可见光)的手段。有很多种辐射度量 (radiometric quantities) 可以用来测量曲面或者某个方向上的光,此处只讨论和反射方程有关的一种量,它就是**辐射率 (Radiance)**,用 $L$ 来表示。
辐射度量学涉及的概念、名词、公式
名称
符号
单位
公式
解析
辐射能量 Radiant Energy
$Q$
焦耳 $J$
-
电磁辐射能量
辐射通量 Radiant Flux
$\Phi$
瓦 $W$
$\displaystyle\Phi=\frac{ ...
光线追踪理论
光线追踪是和光栅化不同的着色方式
过去认为的 Ray tracing 就是 whitted-style ray tracing
现在可以理解为:所有光线传播方法的大集合
(单向和双向)路径跟踪
光子映射
Metropolis light transport(MLT)
VCM / UPBP
sd为什么要使用光线追踪?
光栅化不能很好的控制全局效果,运用光线追踪技术,有以下渲染特性:
更精确的反射、折射和透射。
更准确的阴影。包括自阴影、软阴影、区域阴影、多光源阴影等。
更精准的全局光照。
更真实的环境光遮蔽(AO)
光线追踪技术可以精确地反映复杂的反射、折射、透射、阴影、全局光等物理特性。当然,光线追踪也不是万全的渲染技术,它有苛刻的硬件要求、有限度的渲染特性支持以及噪点干扰等负面特点。
本课关于光线追踪的几个假设(非物理正确)
光沿直线传播
光线与光线之间不会发生碰撞
光路的可逆性,光线的路径可以从眼睛到物体,也可以从物体到眼睛
1 光线投射 RayCasting光线投射的假设:
出射点是一个点
光源点光源
场景物体中的反射为完美的镜面反射,即入射角等于 ...
路径追踪
路径追踪是光线追踪的方法之一,可以做到几乎 100%的真实(照片级真实感)
1 渲染方程与全局光照[[02 PBR理论#渲染方程和反射方程|渲染方程如下:]]
$$L_o(p,\omega_o) = L_{e}(p,\omega_{o})+\int\limits_{\Omega} f_r(p,\omega_i,\omega_o) L_i(p,\omega_i) n \cdot \omega_i d\omega_i$$
直接光点光源的反射方程:点光源只有一个方向有入射光,所以不用积分,多个点光源直接累加即可。
面光源的反射方程:面光源是点光源的集合,因此对面光源所在立体角进行积分可以得出面光源的反射方程
间接光光源不一定都是直接光,还有反射来的间接光。将其他物体反射过来的光当成光源,得到渲染方程
$w_i$ 本来规定从点 $x$ 指向光源,是为了方便光照计算。这里不使用这个规定。将 $w_i$ 规定为视为从反射点指向点 $x$,我们将这个反射来的光也参与光照计算,那么在计算的时候需要将其取负号。
只需要计算反射光,其余参数均已知
我们可以将方程简写:$$I(u) ...
【公式推导01】三维旋转
旋转矩阵
[!NOTE] 约定列向量/右手坐标系
旋转矩阵的应用范围比较广,是姿态变换,坐标变换等的基础。本篇先介绍旋转矩阵的推导过程与助记方法。
旋转矩阵的旋转其实包含两种意思,一是在同一个坐标系下,向量的旋转;二是坐标系的旋转,使得同一向量在不同的坐标系下有不同的坐标。
首先讨论二维平面坐标下的旋转,然后引申至三维。
1.1 2D旋转如下图,XY 坐标系中,向量 OP 旋转β角度到了 OP’的位置:
根据三角函数关系,可以列出向量 OP 与 OP’的坐标表示形式:
对比上面个两个式子,将第 2 个式子展开:
用矩阵形式重新表示为:
这就是二维旋转的基本形式,中间的矩阵即二维旋转的旋转矩阵,坐标中的某一向量左乘该矩阵后,即得到这个向量旋转β角后的坐标。
1.2 3D旋转三维旋转可借助二维旋转来理解,由于三维空间中可以任意轴旋转,为方便分析与使用,只考虑绕 X、Y、Z 轴的旋转。
绕 Z 轴
参照上面的图,添加一个 Z 轴,则上面的二维旋转实际上就是绕 Z 轴的三维旋转
照搬上面的推导公式,并添加 Z 坐标的变换关系 (实际是没有变),然后改写成矩阵形式,红色方 ...