计算机图形学之阴影解读

概览

  • 计算机图形学阴影概览
  • 阴影的物理和数学知识
  • 传统阴影生成算法
    • 投射阴影(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. 使用镜面+漫反射+环境分量绘制地平面
  2. 仅使用环境组件绘制阴影投影(面对面)
案例1:
  • 当阴影接收面在轴平面上
  • 例如有个光的位置 I ( I x , I y ) I(I_x,I_y) I(Ix,Iy),有一个平面 y = 0 y = 0 y=0,有一个点位置 v ( v x , v y ) v(v_x,v_y) v(vx,vy),计算点p
    p x = l y v x − l x v y l y − v y p_x = \frac{l_yv_x-l_xv_y}{l_y-v_y} px=lyvylyvxlxvy
  • 这就是一个初中数学
案例2:
  • 立体的,一会再说
优点
  • 很容易实现
  • 可以跨平台
缺点
  • 除了在完全平面上可以应用,很难在其他平面上应用。
  • 可以控制阴影的程度有限

投射体(Shadow volume)

  • 投射体对于处理接收面是任意平面是一个更加通用的算法,其中阴影将由来自光源的对象投射
  • 由遮光罩(occulder)形成并由遮光罩边缘限定的空间体积,它导致阴影体积内的任何对象处于阴影中
  • 阴影将虚拟世界分为两个部分,一个是有阴影世界,一个是无阴影世界。
    在这里插入图片描述
  • 形成阴影体积的基本步骤:
  1. 查找所有轮廓边(将前向面与后向面分开的边)
  2. 沿远离光源的方向延伸所有轮廓边
  3. 将前盖和/或后盖添加到每个表面以形成闭合体积(可能不需要,具体取决于所使用的实现方式)
被黄色线段覆盖的就是阴影体

在这里插入图片描述

优点:
  • 全方位的方法(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)。
  • 投影阴影限制平面接收机,没有自我影子
  • 需要多边形表示影像卷和剪切阴影体多边形的影像卷需要被寻址
  • 影像映射图是一种图像空间技术,有两个输出路径,如果所有相关的对象都对于光可见,则正确地工作。
  • 区域光线制造软阴影
  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值