Pixel World

it's better be burning out than to fade away.

The Geometry Behind Normal Maps

切线空间是什么,它到底为什么存在?
切线空间并非一种渲染技巧。它是一个在任何带有参数化表示的曲面上都会出现的几何结构。我只是之前没有把这些点联系起来。
当我们用 UV 坐标来定义切线空间时,它就成为了连接纹理坐标的平面世界与3 曲面的弯曲世界之间的桥梁。一旦你看到了这种联系,法线贴图的原理就豁然开朗了。
在这篇文章中,我将把切线空间拆解开来,逐一分析:它到底是什么,它是如何从 UV 中产生的,它是如何计算的,以及它如何构成法线贴图和其他依赖于局部表面朝向的技术的基础。

阅读全文 »

Weighted Blended Order-Independent Transparency (WBOIT) 是一种非常实用的顺序无关半透明渲染技术。它通过在着色器中对每个片元的颜色和透明度进行加权求和,巧妙地避免了传统半透明渲染中复杂且耗时的排序问题,在性能和效果之间取得了很好的平衡。WBOIT算法的实现主要包含两个Pass:Accumulation Pass 和 Composite Pass。

阅读全文 »

AABB Plane intersection

核心判定逻辑:计算AABB中心到平面的有符号距离(signed distance),并与AABB在平面法线方向上的投影半径(projection interval radius)进行比较。

平面由法向量n和到原点的距离d定义:

$x\cdot \vec{n} = d$

AABB由最小角点 min 和最大角点 max 定义,可以将其转换为中心-半边长(center-extents)表示:

中心点:$c = (min + max) / 2$

正半边长:$e = max - c$

投影半径计算:

AABB在平面法线n方向上的投影半径r为各轴向半边长在法线方向上的绝对值之和,这实际上是AABB在法线方向上的最大”半径”——从中心到最远顶点的投影距离,直观理解可以表示为AABB在法线方向投影的覆盖范围

阅读全文 »

ZFighting

为什么是 1/z

GPU 硬件深度缓冲区通常不会存储物体在相机前距离的线性表示。相反,深度缓冲区存储的值与世界空间深度的倒数成正比。
在本文中,用 d 表示存储在深度缓冲区中的值( [0, 1] 范围内),用 z 表示世界空间深度,即相机viewSpace下lookAt方向的实际距离,以世界单位(如米)表示。一般来说,它们之间的关系具有以下形式:

阅读全文 »

Gaussian Blur

Gaussian Function

高斯函数(或正态分布函数)在各个领域中被广泛应用。标准差 σ 决定了数据在均值周围的分散程度。较大的标准差会使数据分布得更分散。(体现在高斯模糊上就是图片会变的更糊)

阅读全文 »

Primitive Restart是渲染中的一个重要特性,主要用于高效渲染多个独立的图元序列(例如三角形条带、线条条带等),而无需发出多个绘制调用或在索引数据中插入“退化”图元(即面积为零或不可见的图元)。下面从概念、工作原理、使用场景、优缺点以及在不同图形API中的具体实现等方面进行详细解释。

阅读全文 »
0%