计算机图形学之阴影解读
概览
- 计算机图形学阴影概览
- 阴影的物理和数学知识
- 传统阴影生成算法
- 投射阴影(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:
- 当阴影接收面在轴平面上
- 例如有个光的位置I(Ix,Iy)I(I_x,I_y)I(Ix,Iy),有一个平面y=0y = 0y=0,有一个点位置v(vx,vy)v(v_x,v_y)v(vx,vy),计算点p
px=lyvx−lxvyly−vyp_x = \frac{l_yv_x-l_xv_y}{l_y-v_y}px=ly−vylyvx−lxvy - 这就是一个初中数学
案例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)。
- 投影阴影限制平面接收机,没有自我影子
- 需要多边形表示影像卷和剪切阴影体多边形的影像卷需要被寻址
- 影像映射图是一种图像空间技术,有两个输出路径,如果所有相关的对象都对于光可见,则正确地工作。
- 区域光线制造软阴影
计算机图形学之阴影解读相关推荐
- 可以买的一本书:3D计算机图形学(原书第3版)
作 者 (英)沃特(Watt,A.) ,包宏 译 出 版 社 机械工业出版社 图书定价 ¥69.00 第1章 计算机图形学的数学基础 1 1.1 处理三维结构 1 1.1.1 计算机图形学中的三维仿射 ...
- 计算机图形学阴影的的分类,计算机图形学8_光照模型与阴影处理_.pdf
您所在位置:网站首页 > 海量文档  > 计算机 > 图形图像 计算机图形学8_光照模型与阴影处理_.pdf5页 本文 ...
- 计算机图形学 实验三 相机、阴影、光照
文章目录 实验3.1 相机定位 一. 实验目的 二. 理论背景 1.各个坐标系 世界坐标系 相机坐标系 模型视图矩阵 ndc坐标系 2. 齐次坐标 3. OpenGL观察变换 三. 实验内容 Look ...
- 13、计算机图形学——阴影贴图
一.图形学中阴影的产生原理 阴影产生的原因就在于相机能看到的地方而光源无法照射到,所以,基于此,就有了下面的过程 首先从光源的方向放一个相机,进行一次透视投影,但是,只保存透视投影后深度信息 然后,从 ...
- 计算机图形学笔记十一:Ray Tracing1(阴影,光线追踪基本原理)
阴影,光线追踪基本原理 1.阴影贴图(Shadow Mapping) 1.1产生步骤 1.2存在问题 2.光线追踪( Ray Tracing) 2.1为什么需要光线追踪? 2.2基础光线追踪算法(Ba ...
- 14、计算机图形学——whited-style光线追踪
一.为啥需要光线追踪 以往的Blinn-Phong光照模型在渲染场景时,对于光的漫反射和镜面反射都只会计算一次,但是实际上在一个场景里面,光有可能既存在反射也存在折射,而且,反射次数和折射次数并不只是 ...
- 9、计算机图形学——纹理的应用(环境贴图、凸凹贴图、法线贴图以及位移贴图)
一.环境贴图 比如下面的这张图,左边的是一张表示环境光的纹理,这个纹理表示屋子内部四面八方都是啥样,右边是一个茶壶, 将纹理映射到这个茶壶上,就能茶壶上渲染出周围的环境 还有这样的球形环境贴图(sph ...
- 华人小哥开发“CG工坊”,帮你快速入门计算机图形学 | GitHub热榜
子豪 发自 凹非寺 量子位 报道 | 公众号 QbitAI CG新手们,你们的福音来了~ 为了让初学者更好地学习计算机图形学基础知识,一位哈佛小哥创建了graphics-workshop,一周左右的时 ...
- 关于计算机图形学的学习(转)
本文合适的题目应当是:白话说学计算机图形学? 1. 引言 什么是计算机图形学? 本文尽量避免给它做严格的定义,但是通常来说,计算机图形学是数字图象处理的逆过程,这只是一个不确切的定义,后面我们会看到, ...
- 用JavaScript玩转计算机图形学(二)基本光源
上一篇介绍了简单的光线追踪,凑合了临时用的光源去渲染效果.这次将讲解三种基本光源,及一些背景理论.过分简化的教材和现成API(OpenGL/Direct3D等)可能会做成一些错误理解.在此,希望文章能 ...
最新文章
- 新手求助:大神们帮帮我,关于在ViewPage中添加GridView的问题
- php调用css类,php – 使用xpath选择css类
- iotop--补齐系统监视工具缺失的一环
- mysql切换到使用openssl,MySQL主从复制+OpenSSL
- 设计模式总结篇系列:工厂方法模式(Factory Method)
- 【TensorFlow】TensorFlow从浅入深系列之九 -- 教你认识图像识别中经典数据集
- 这才是2019年小程序的趋势,你该如何把握机会?
- 华硕电脑的触摸板关闭
- 无光驱、软驱、USB全NTFS格式硬盘上安装WinXP
- 智慧城市项目在PPP模式中的应用
- 空间梁单元C语言有限元编程,有人会有限元编程吗
- Web前端工程师就业薪资有多少?新人能月入过万吗?
- java统计误码率_MATLAB通信工具箱来计算误码率
- IE8 正式版官方下载链接
- 用大数据思考用户体验 纪学锋谈《江湖》特色
- 关于cv::warpaffine函数
- JS生成 UUID的四种方法
- 别把激励员工变成收买员工
- 数据结构学习之二叉树(理论篇)
- 分别以逆时针和顺时针旋转坐标点