DirectX12 15 贝塞尔曲线
[toc]
# 贝赛尔曲线
什么是贝塞尔曲线?
比如有三个控制点,二次贝塞尔就是通过这三个控制点的连线进行了两次线性插值 直接给结论: (朴素的也可以用递归的方式来计算) N 阶贝赛尔曲线可以使用伯恩斯坦基函数的形式来表示:
基于伯恩斯坦多项式求第 t 的三次贝塞尔曲线多项式算法
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748/// <summary>/// 由伯恩斯坦多项式推导出的三次贝塞尔曲线多项式(参数)///...
more...
DirectX12 图像模糊
[toc]
# 模糊理论
图像模糊理论即针对图像中任意一个像素 P_ij ,计算以它为中心的 m*n 矩阵的加权平均值,这个值就是模糊后的颜色。 这个理论实际上就是数字图像处理中的 算子/核 来计算的
# 高斯模糊
高斯模糊借助上述函数来获取周边像素信息对当前像素的贡献权重
事实上高斯函数的图像就是一个正态分布的函数图像
而这种函数经常被用作描述 能量分布 的背景中 但是通常高斯模糊的和不为 1, 这时就需要对它进行归一化的处理:
为什么要用到高斯模糊呢?
首先高斯模糊具有可分离性,即可以横着算,然后再纵着算,假设有 9*9=81 的核,正常计算,需要计算 81...
more...
UGUI - TEXT 扩展
[toc]
# UGUI Text 扩展
比如需要在 Text 组件中实现下划线的功能,这个功能 UGUI 本身并不支持,所以需要自己去实现,实际上,在 UGUI 中对于一个组件进行定点都够早通常都是通过 OnPopulateMesh() 方法来进行的,接下来本文讲从 Text 组件触发来进行介绍
# 1. 如何控制组件的 Mesh 生成
首先 Text 组件会提供一个函数
123protected override void OnPopulateMesh(VertexHelper toFill){}
VertexHelper 是最终该文本组件要输出的...
more...
Directx12 14 计算着色器
[toc] First. GPU 并行架构的优势在什么时候才会体现出来?
拥有大量执行相同操作的数据时
# 线程与线程组
在 GPU 编程的过程中,根据程序具体的执行需求,可将线程划分为线程组构成的网格。 一个线程组运行于一个多处理器之上,但为了获取更好的性能,通常会令多个处理器至少拥有两个线程组 (类似于操作系统的线程)。
每个线程组内都有一块共享内存,供组内的线程访问。但是,线程并不能访问其他组中的共享内存。 一个线程组有 n 个线程。硬件实际上会将这些线程分为多个 warp,每个 warp 中有 32 个线程,而且多处理器会以 SIMD32 的方式来处理...
more...
DirectX12 13 几何着色器
[toc]
# 什么是几何着色器?
如果不启用曲面细分的话,那么几何着色器这个可选择的阶段实际上是位于顶点着色器与像素着色器之间的。顶点着色器以顶点作为输入数据,而几何着色器的输入数据则是完整的图元,例如,如果要绘制三角形列表,则几何着色器实际上将对列表中的每个三角形 T 执行下列操作
12for(UINT i = 0; i < numTriangles; ++i) OutputPrimitiveList = GeometryShader(T[i].vertexList);
可以注意到,几何着色器以每个三角形的 3...
more...
DirectX12 12 模板
[toc]
# 深度 / 模板缓冲区的格式
深度 / 模板缓冲区实际上也是一种纹理,故而必须使用纹理的格式创建它。
1. DXGI_FORMAT_D32_FLOAT_S8X24_UINT: 使用一个 32 位浮点数来指定深度缓冲区,并以另一个 32 位无符号整数来指定模板缓冲区。其中 8 位用于模板缓冲区映射 [0,255], 另外 24 位不可用。
2. DXGI_FORMAT_D24_UNORN_S8_UINT: 指定一个无符号 24 位深度缓冲区,并将其映射到范围 [0,1] 内,另外 8 位用于模板缓冲区映射范围 [0,255]...
more...
DirectX12 通过混合实现雾效
[toc] 先说明下雾效的用处
其实雾效除了在效果上的用处外,还有其他的作用,如:
1. 远处的浓雾可以掩饰远处渲染上的失真
2. 为了防止物体突然的出现 (popping)[如视椎体中突然出现新物体,或者场景裁减中忽然实例化出新物体], 可以使用雾效来掩饰
# 龙书中实现雾效的方法
即片元的颜色与深度以及雾的颜色进行插值 参数 s 的范围是 [0,1], 这个参数是以摄像机位置和物体表面点之间的距离为参数的函数来确定的 其中,dist (p,E) 是表面点 P 与摄像机位置 E 之间的距离函数,saturate 会将这个值限制在 [0,1] 之间
# HLSL...
more...
DirectX 11 混合
[toc]
# 什么是混合 (blending)
混合是使我们已经计算好的像素 (片元) 与当前正在计算的像素 (片元) 进行颜色的混合和融合 (即半透明之类的效果)
以及另一种混合方法,即 "离屏" 混合,有时候可以直接将像素渲染到一个 "离屏" 的渲染目标中,然后与当前帧进行混合
# 混合方程
设 C_src 为当前正在光栅化的第 i 行、第 j 列像素 (源像素) 的颜色值,再设 C_dst 为目前在后台缓冲区中与之对应的第 i 行、第 j 列像素 (目标像素) 的颜色值 在混合之前,C_scr 会先进行深度 /...
more...
DirectX12 10 纹理过滤器
[toc]
# 纹理过滤器
# 放大
双线性插值
# 缩小
# mipmpa 采样
通常缩小会使用 mipmap
mipmap 会在渲染前进入到 GPU 的缓冲区内,然后在渲染时计算出片元的 lod 层级,选择最匹配的 mipmap 层级进行采样, 但其实 mipmap 也有两种采样方法
点采样:即每个层级只在某一个 mipmap 中进行采样
跨层级采样 (mipmap 线性过滤): 选择最接近的两个 mipmap 层级,然后对这两个 mipmap 层级进行插值计算
# 各向异性过滤
当多边形法向量与摄像机观察向量之间的夹角过大时导致的失真现象可以使用各向异性过滤器...
more...