投影纹理映射与阴影 |《GPU编程与CG语言》笔记(三)

投影纹理映射

这部分《Unity》一书里只是提了下概念,没有详细的说明。投影纹理映射和普通的纹理贴图不同,它是像用投影仪把画面投射到物体上一样,纹理坐标是通过投影计算出来的,而不是指定的。

涉及到“纹理实时和空间顶点对应”通常都会用到纹理映射技术,如阴影绘制、体绘制算法等。

投影纹理映射示意图

优点:

  • 将纹理与空间顶点进行实时对应,不需要预先在建模软件中生成纹理坐标
    例如,Unity中的延时渲染,需要运行两个Pass。第一个Pass进行深度检测,将深度信息保存在一张纹理中;第二个Pass需要读取纹理信息。
    如果按照一般的纹理贴图的方法,则需要预先保存每一个物体的顶点在这张纹理中的纹理坐标;而投影纹理映射是实时计算需要的顶点的纹理坐
    标。

  • 避免纹理扭曲

原理:

从物体本身的顶点出发,找到其在纹理上的坐标。纹理坐标和纹理是什么没有关系,而是通过相机位置、角度和模型顶点坐标决定的。

投影纹理坐标实际上就是将之前提到的NDC空间坐标的x,y值归一化成0到1之间(这是在相机就是投影机的情况下,如果投影机不是当前相机,例如阴影计算把灯光当成投影机,要用类似的方法计算即可)。

Shadow Map

这本书里讲到Shadow map感觉少了一个步骤,不如上一本书里讲的形象和具体,但是上一本书中的概念不太清楚。

原理:

把一个假象的相机放在光源位置,那么相机照拍摄不到的地方就是阴影所在的地方。

步骤: (这部分是我的理解,可能和书中的逻辑不同)

  1. 把一个虚拟的相机放在光源位置,把顶点坐标转换到这个相机(光源)空间下,《Unity》一书里称之为光源空间;
  2. 和正常的渲染过程一样,为虚拟相机生成一张深度纹理;
  3. 对于真实裁剪空间中的每一个顶点,使用其光源空间的坐标作为纹理坐标,在步骤2中的深度纹理上获取到深度d1
  4. 计算该点到光源的真实深度d2
  5. 比较d1和d2,若d1小于d2则说明该点处于阴影中。

屏幕空间的阴影映射技术:

《Unity》一书中提到的技术,不把顶点变换到光源空间,而是把(真实的)相机的深度纹理变换到光源空间,然后将两个深度比较。


图片来自 东隆咚

你可能感兴趣的:(投影纹理映射与阴影 |《GPU编程与CG语言》笔记(三))