计算机图形学之阴影解读
概览
- 计算机图形学阴影概览
- 阴影的物理和数学知识
- 传统阴影生成算法
- 投射阴影(Projection shadow)
- 阴影体(Shadow volume)
- 阴影映射(Shadow map)
- 软阴影(Soft shadows)
计算机图形学阴影概览
- 计算机的写实化(photorealism)主要有两个元素
- 准确的表达表面的属性(accurate representation)
- 关于光效果好的物理描述(Good physical desciption)
- 光表面效果包括
- 光反射(light reflections)
- 透明度(transparency)
- 表面材质(Surface Texture)
- 阴影(shadow)
- 计算机图图形学中,物体经常在没有阴影或锚定(anchored)的环境下渲染
- 阴影可以被考虑为一个被光源隐去的区域
- 然而,实时逼真渲染是一个非常昂贵的操作
- 作为替代方案,大多数应用会采用阴影贴图。
阴影的重要性
- 阴影告诉我们物体的相对位置和运动
- 阴影提供很多隐含信息
- 对象投射和接收阴影的位置
- 到光源的位置
- 阴影提供非隐含信息
- 物体的形状
- 阴影接受物体的形状
阴影生成物理数学知识
- 硬阴影(umbra) 是一个从光源处出发不可视的区域。
- 软阴影(penumbra)是一个可以接收到部分光的区域。
传统阴影生成算法
- 阴影算法不是基于光栅化的渲染管道的标准功能
热门的阴影生成算法有
- 投影算法
- 阴影体
- 阴影映射
- 软阴影
投射算法
- 投影阴影(也称为投影阴影或平面阴影)是在OpenGL场景中实现阴影的简单方法,其中将对象投影到平面上,然后将平面渲染为单独的对象或基元
- 它适用于由点光照射的平面
- 对于每个面,投影顶点V以找到阴影多边形的V’
- 物体阴影=面投影的联合
基础步骤
- 使用镜面+漫反射+环境分量绘制地平面
- 仅使用环境组件绘制阴影投影(面对面)
案例1:
- 当阴影接收面在轴平面上
- 例如有个光的位置,有一个平面,有一个点位置,计算点p
- 这就是一个初中数学
案例2:
- 立体的,一会再说
优点
- 很容易实现
- 可以跨平台
缺点
- 除了在完全平面上可以应用,很难在其他平面上应用。
- 可以控制阴影的程度有限
投射体(Shadow volume)
- 投射体对于处理接收面是任意平面是一个更加通用的算法,其中阴影将由来自光源的对象投射
- 由遮光罩(occulder)形成并由遮光罩边缘限定的空间体积,它导致阴影体积内的任何对象处于阴影中
- 阴影将虚拟世界分为两个部分,一个是有阴影世界,一个是无阴影世界。
- 形成阴影体积的基本步骤:
- 查找所有轮廓边(将前向面与后向面分开的边)
- 沿远离光源的方向延伸所有轮廓边
- 将前盖和/或后盖添加到每个表面以形成闭合体积(可能不需要,具体取决于所使用的实现方式)
被黄色线段覆盖的就是阴影体
优点:
- 全方位的方法(omi-direction)
- 自动自成阴影(automatic self-shadowing)
- 窗口空间阴影确定(windows-space shodow determine)
缺点
- 消耗大量的GPU填充率
- 需要具有连接性的多边形模型
- 剪影计算是必需的(sihouette computation are required)
- 仅限理想光源
阴影映射
- 阴影贴图是通过测试像素是否从光源可见,通过将像素与以纹理形式存储的光源视图的Z缓冲区或深度图像进行比较来创建的
- 这种技术比阴影体积更不精确,但是阴影贴图可能是一种更快的选择,这取决于在特定应用程序中这两种技术需要多少填充时间,因此可能更适合于实时应用程序。
- 分为两种方法(Lance Williams于1978年介绍):
- 从灯光的视角渲染场景
- 像对待相机一样对待光线
- 渲染到深度纹理以创建阴影贴图
- 从相机的视角渲染场景
- 在顶点明暗器中将每个顶点从世界空间转换为光空间
- 将光空间位置发送到片段明暗器
- 将片段的深度与阴影贴图中存储的深度进行比较。如果深度较大,则隐藏
案例
- 图描述:几何图形从灯光的角度渲染到深度缓冲区。更具体地说,顶点明暗器(vertex shader)将几何体转换为灯光视图空间。
最终结果是一个深度缓冲区,其中包含从灯光的角度观察到的场景深度信息。 - 图说明:顶点明暗器将每个顶点变换两次。每个顶点都被转换到相机的视图空间中,并作为位置传递到像素明暗器。每个顶点也由灯光的“视图投影”纹理矩阵转换,并作为纹理坐标传递给像素明暗器。视图投影纹理矩阵与使用附加变换渲染场景的矩阵相同。这是一种将点从视图空间(X和Y中为-1到1)缩放并转换为纹理空间(X中为0到1,Y中为1到0)的转换。
- 像素明暗器接收插值位置和插值纹理坐标。执行深度测试所需的一切都在这个纹理坐标中。深度测试现在可以通过将第一次通过的深度缓冲区与X和Y纹理坐标进行索引,并将生成的深度值与Z纹理坐标进行比较来执行。
优点
- 不需要模板缓冲区(stencil buffer)
- 当阴影很多的时候,比阴影体算法快
缺点
- 只可以操作平行光
- 自阴影是不正确的
- 背后阴影是不正确的。
软阴影
- 软阴影是一种区域光创建半影,其中光从给定点仅部分可见。
- 为了产生软阴影,我们按区域(称为区域光)对光源进行建模,区域被划分为子区域或区域。
- 它也可以通过一组点光源进行建模。
多点光源的软阴影
- 添加剂混合用于积累每种光的贡献。
- 阴影的柔和程度取决于足够数量的样本。
- 渲染场景的时间随用于近似区域光源的采样数线性增加。
总结
- 阴影传输大量的信息,以提供一个物体的基本视图,在这个物体上,没有影子显示的物体会在平面上漂浮(float above the plane)。
- 投影阴影限制平面接收机,没有自我影子
- 需要多边形表示影像卷和剪切阴影体多边形的影像卷需要被寻址
- 影像映射图是一种图像空间技术,有两个输出路径,如果所有相关的对象都对于光可见,则正确地工作。
- 区域光线制造软阴影