1.6k 1 分钟

# Compute shader View 的话有以下几种: ID3D11ConstantBufferView(CBV),表示 Resource 是只读的 Buffer。 ID3D11ShaderResourceView(SRV),表示 Resource 是只读的 Texture。 Compute shader ce8a4f41e18845b0ac4fb1978f28869f.md ID3D11RenderTargetView(RTV),表示 Resource 是只写的 RenderTarget。 ID3D11DepthStencilView(DSV),表示 Resource 是只写的...
121 1 分钟

# GTAO 每个像素点向周围打一个锥形,锥形为固定值,最后求出的值相加 图中距离越远贡献越小 每个 step max 上一个 step 求出最大水平角 h1 和 h2 同时打出去,求他们最大夹角 UE4 Mobile GTAO 实现 (HBAO 续)
267 1 分钟

# HZB (Hierarchical Z-Buffer) HZB 是多 Mip 层级的 z-buffer,也就是说 depthmap 的 lod,每个更高级别 Mip 的 buffer 记录上一级别中周围四点中最远处的深度值。 将 HZB 生成后,就可以将待剔除物体的包围盒信息传入到 Computer Shader 中进行计算,计算时会选择最适合的 Mip 级别进行遮挡测试。在屏幕中占比更大的物体会选择更高级别 Mip 的深度进行测试,这样可以降低计算量。 计算 hzb 时候的计算了是非常小的,昂贵的是从 gpu 传输到 cpu 上
34k 31 分钟

# HLSL 语言基础 HLSL(High-Level Shading Language, 高级着色语言) 是由微软开发的一种着色器语言,D3D9 及以上版本使用其作为着色语言(注:D3D8 的 shader 使用是类似于汇编的语言来编写),拥有如下特点: 基于 C 语言的语法(如:大小写敏感,每条语句必须以分号结尾),是一门面向过程的强类型语言(type sensitive language) 除了 bool、int、uint、half、float、double 基础类型外,还支持数组类型,另外 HLSL 还内置了适合 3D...
388 1 分钟

# MVP 矩阵 # Ue4 project matrix N/near 为近裁片面到相机的距离,f 为远裁屏幕到相机的距离,fovV 为上下角度,fovH 为左右宽度,ue 设置的 fov 主要是设置 fovH。 投影矩阵推到: [图形学笔记] 推导投影矩阵 在顶点经过投影矩阵变换后变为裁剪空间,之所以称为裁剪空间,是因为基于以上裁剪空间坐标,将 x、y、z 和 [-w,+w] 比较,其中 w = -z,这个 z 是顶点在 View Space 中的 z 值(为了满足投影性质推导出来的值,这里负号因为推导用的 View Space 是右手坐标系,NDC 是左手坐标系)是个超过 1...
6.4k 6 分钟

# SH 求谐函数与立体角 # 直角坐标系转球面坐标系 球坐标转 uv 12345678910111213141516//uv转vectorfloat4 UniformSampleSphere( float2 E ){ float Phi = 2 * PI * E.x; float CosTheta = 1 - 2 * E.y; float SinTheta = sqrt( 1 - CosTheta * CosTheta ); float3 H; H.x = SinTheta * cos( Phi ); H.y = SinTheta * sin( Phi ); H.z...
6.3k 6 分钟

# TAA TAA 原理是通过 Motion Vector,找到上一帧的当前像素点的信息,然后混合,因为上一帧信息有很大概率还会出现在屏幕内。同时,对投影矩阵使用 noise 进行半个像素距离的偏移,使得每一帧的投影矩阵与上一帧都不一样,也就相当于混合了多次采样的结果,实现超级采样。 在采样的时候可以用周围 8 格,此时要是上一帧的投影矩阵 projection 到当前帧 uv 是在屏幕外面的话,可以用模糊 123456789101112131415161718float3filter(float3samples[9]){#if...
1.3k 1 分钟

# VXGI Lumen 中的 VoxelLighting 和 VXGI 类似,使⽤是基于 3D Clipmap 的⽅式以节省存储空间。但 Lumen 的 VoxelLighting 中的每个 3D 纹素和 VXGI 中的 Voxel 并不相同 ——Lumen 的每个 3D 纹理表⽰的是 Ambient Cube 某⼀个⽅向上的光照投射参数,实际上它所需要的 3D 纹素数量是其 Size 的 6 倍。这⼉可以看到 VoxelLighting 选择了和 MeshCards ⼏乎完全相同的结构 (六⾯体) 和基函数 (AmbientCube) VoxelLighting 默认使⽤ 4 级 3d...
1.3k 1 分钟

# Visibility Buffer Visibility Buffer 解决了传统延迟渲染的几个问题: 带宽高; 对于可见性和着色阶段的不完美的分离,会造成 Overdraw; 不能使用 MSAA。 Visibility Buffer 通常需要这些信息: (1)InstanceID,表示当前像素属于哪个 Instance(16~24 bits); (2)PrimitiveID,表示当前像素属于 Instance 的哪个三角形(8~16 bits); (3)Barycentric Coord,代表当前像素位于三角形内的位置,用重心坐标表示(16 bits); (4)Depth...
5k 5 分钟

# 图片压缩算法 # DXTC DXTC(或 BC)为微软为 DX 而推出的基于 block 的贴图压缩格式,其主要采用调色板的原理来进行压缩。 BC1: 基于 4x4block 来进行,不含有 alpha 通道,每个 block 内记录两个 16bits 的颜色做为基准颜色,然后解压时再使用两个基准色调制出另外两个颜色做为块内 4 个压缩颜色。其计算方式为: basecolor2 = 2/3 *basecolor0 + 1/3 * basecolor1 basecolro3 = 1/3 *basecolor0 + 2/3 * basecolor1 对于每个块内的 texel,存储 2bits...
140 1 分钟

# 旋转相关 # 欧拉角 to 旋转矩阵 # 欧拉角变四元数 # 四元数 四元数是个超复数 满足 i^2 = j2=k2 = -1,四元数 P=a+bi+cj+dk(I 绕 x 旋转,j 绕 y 旋转,k 绕 z 旋转)abcd 均为实数, 虚数是 z = a+bi. , i^2 = -1
969 1 分钟

# 杂项 # 求曲率 ""12345678float curvature(float3 VertexNormal,float3 WorldPositon){ float DeltaN = length(abs(DDX(VertexNormal)+DDY(VertexNormal))); float DeltaP = length(abs(DDX(WorldPositon)+DDY(WorldPositon))); float curvature = DeltaN / DeltaP ; reture curvature ;} #...
3.2k 3 分钟

# 空间结构划分 # 层次包围盒 | Bounding Volume Hierarchies , BVH 层次包围盒(Bounding Volume Hierarchies, BVH)方法的核心思想是用体积略大而几何特征简单的包围盒来近似地描述复杂的几何对象,从而只需对包围盒重叠的对象进行进一步的相交测试。此外,通过构造树状层次结构,可以越来越逼近对象的几何模型,直到几乎完全获得对象的几何特征。 对于三维场景的实时渲染来说,层次包围体(Bounding Volume...
435 1 分钟

# 范数 归一化公式,范数就是向量的长度 # Frobenius 范数(F - 范数) 一种矩阵范数,即矩阵中每项数的平方和的开方值。也是 这个范数是针对矩阵而言的,具体定义可以类比 向量的 L2 范数。 可用于 利用低秩矩阵来近似单一数据矩阵。用数学表示就是去找一个秩为 k 的矩阵 B,使得矩阵 B 与原始数据矩阵 A 的差的 F 范数尽可能地小。 矩阵 A 的 Frobenius 范数 为所有元素平方和再开方。另一个观点是矩阵 A 的所有列向量的 l2 范数平方和再开方。由此可以得到矩阵 A 的 F 范数的另外两种方法:所有奇异值的和、trace (A^TA)。 Minkowski-P...
227 1 分钟

# 迭代法 # 牛顿迭代法 # Jocobi 迭代法 x 为我们要求的公式,例如隐性弹簧质点系统的 v,A 为要求的方程,就是质点弹簧公式 # 高斯 - 赛德尔迭代(Gauss–Seidel method) 高斯迭代法和 jocobi 迭代法类似,jocobi 用的是上一个值,高斯用的是当前值, 高斯迭代适用于大型稀疏线性方程组,本质上是串行计算,其需要保留上一帧所有顶点坐标的值,所以不利于并行计算,但其收敛速度较快,模拟更准确。 Jocobi 有着更好的并行计算
1.3k 1 分钟

# 埃尔米特矩阵 埃尔米特矩阵(英語:Hermitian matrix,又译作厄米特矩阵,厄米矩阵),也稱自伴隨矩陣,是共轭對稱的方陣。埃尔米特矩阵中每一个第 i 行第 j 列的元素都与第 j 行第 i 列的元素的复共轭。 对于:A={ai,j}∈Cn×n有:ai,j=aj,i‾其中(⋅)‾为共轭算子。 记做:A=AH\text{对于:}{\quad}{\displaystyle A=\{a_{i,j}\}\in C^{n\times...
365 1 分钟

# 正定矩阵 在线性代数裡,正定矩阵(英語:positive-definite matrix)是埃尔米特矩阵的一种,有时会简称为正定阵。在线性代数中,正定矩阵的性质類似复数中的正实数。与正定矩阵相对应的线性算子是对称正定双线性形式(複域中则对应埃尔米特正定双线性形式)。 # 定义 一个 n×n 的实对称矩阵 M 是正定的,当且仅当对于所有的非零实系数向量 z,都有 zTMz > 0。其中 zT 表示 z 的转置。 对于复数的情况,定义则为:一个 n×n 的埃尔米特矩阵 (或厄米矩阵)M 是正定的当且仅当对于每个非零的複向量 z,都有 zMz* > 0。其中 z**...
1.1k 1 分钟

# 酉矩阵 在線性代數中,么正矩陣(又译作幺正矩阵,英語:unitary matrix)是一個 n×n 複數方塊矩陣 U,其滿足以下性質: U∗U=UU∗=In ,{\displaystyle U^{*}U=UU^{*}=I_{n}} , U∗U=UU∗=In​ , 其中 U* 是 U 的共軛轉置,In 是 n×n 單位矩陣。 換句話說,么正矩陣的逆矩陣,就是其共軛轉置: U−1=U∗。{\displaystyle...
2.1k 2 分钟

# 前言 现在 Niagara 虽然正式版虽然已经过了两个版本,由于 niagara 是设计是在程序与美术之间做取舍而设计出来的,他的本质是个 computer shader,所以出现要是美术用的话,入门有点难,不像级联那样入门那么简单,因为他存在属性与绑定这程序上的东西。然后我也看到很多人总是问一些很简单而常见的问题,所以我决定写一遍文章做个收集,方便更多使用新手使用 niagara 的时候不用四处找资料。 # 问题与技巧收集 # 定义粒子的轴向 图中 alignment 是粒子的朝向,facing mode...
3.8k 3 分钟

# 一、序言 在群友的提醒下,我找了下知乎上面关于特效的文章,一般都是关于 niagara 里面的一些算法,或者材质上面做一些高级算法或者 Raymarch,这些都是技术!说这些东西对美术或者逻辑能力弱的人来说是非常痛苦的一件事,特别是对新手或者刚从别的美术行业转行过来的。刚学的时候他们会走很多弯路,会学习大量算法去实现一个只需要在美术上做点小技巧就可以很好看的特效。 再加上 UE4 Niagara 的推出,很容易让特效更偏向于技术而忽略了美术。然而这一部分人在学习的过程中会发现逻辑的乐趣从而再转行去当 TA 或者程序,那这样是不是可以说 niagara 是 TA...