3D游戏图形光照技术

2020-03-01 142浏览

  • 1.三维光照明计算
  • 2.上节课主要内容 三维几何变换 绘制流程 基于 OpenGL/Direct3D 的三维变换
  • 3.主要授课内容 光照明计算的主要原理 Direct3D 光照
  • 4.
  • 5.线框图 简单的颜色填充 平行光源下的 光滑绘制模式 简单光照 方向光源
  • 6.阴影 简单纹理映射 全局光照明 : 阴影 、高光等
  • 7.光照明模型  光照计算考虑了物体表面之 间的电磁能量交互  采用物理或经验公式  只有到达眼睛的才被可见 ◦ 直接光照直接决定于光源颜 色 ◦ 间接光照还取决于各次反射 、折射、散射之间的交互属 性
  • 8.局部和全局光照明模型 局部 全局 仅与局部物体表面和光源有关 某一个点的光照与场景中其他点有关
  • 9.全局光照明模型 所谓全局光照模型( Global Illuminatio n ),就是在计算光照的时候考虑所有光源 ,其中不仅包括光源本身,也包括从其他物 体上反射过来的光线。使用全局光照明模型 的算法包括光线跟踪( Raytracing )和光 能传递( Radiosity )。由于这种算法都有 很高的计算强度,目前,硬件还鲜有能力进 行真正的实时渲染,所以目前版本的 Ogre 也没有支持任何真正的全局光照明算法。
  • 10.全局光照明模型 不过相对而言,还有一些准全局光照明 算法模型的存在(更精确的说,是半影 模型“ Soft Shadow Model” ),其中 包括环境光吸收算法( Ambient Occlusion ,简称 AO )以及计算次表 面散射算法( Percomputed Radiance Transfer ,简称 PTR )已经 被“通过”为 3D 硬件的解决方案。 Ogre 提供了对其中 AO 渲染算法的支持。
  • 11.局部光照模型 在局部光照的模型中,对 物体的光照 对 对对 对对 计算只考虑光源和物体本身。详细一点 地讲,就是通过物体表面法线以及材质 属性来计算光照最终在摄像机中的表现 ,最终计算出的颜色值提供给显示器输 出。
  • 12.视点相关的绘制(光线跟踪) 场景几何 必须逐个视点计算
  • 13.视点无关的方法(辐射度) 预先计算场景中每个点的光 照度
  • 14.光与材质之间的作用 相互影响关系由材质决定 颜色、光滑度和明亮度由执行相互影响决定 光碰到一个曲面将:吸收、反射、传输 渲染还决定于曲面的朝向(法向) 三种基本的光-材质作用 I ( x, x' ) g ( x, x' )[ ( x, x' )   ( x, x' , x" ) I ( x' , x" )dx" ] s
  • 15.局部照明计算 局部光照明计算按 RGB 三分量分对 计 对 算泛光、漫射光和镜面光,其中三个主 要步骤为: 1. 计算曲面上的全局泛光 2. 对场景中的每个光源计算它对曲面的 漫射和镜面光分量的贡献 3. 计算曲面本身的反射光 . 更精确的模型需考虑半透明曲面情况。
  • 16.镜面反射 曲面看上去很光滑 反射光在反射角的周围的 狭窄区域起作用 镜面是完美的镜面反射
  • 17.漫射 光向所有方向发射 粗糙曲面 完美漫射曲面向各个方向均 匀出射
  • 18.半透明曲面 部分光将穿透或从某个其他 位置散出 精确的模型必须考虑折射和 散射 部分入射光也在物体表面上 直接被反射出来
  • 19.BRDF  双向反射率分布函数:描述了给定的光照度条件下某 个角度的反射光照度,或者说:入射的光在某个方向 反射的比例 理想镜面 粗糙镜面 理想漫射 方向漫射
  • 20.光照明计算涉及的因素  视平面的位置和朝向  光源 p0 ◦ 位置 ◦ 属性 N  场景物体 ◦ 相对于光源的位置 ◦ 相对于其他物体的位置 ◦ 材质属性  不透明、半透明、明亮、昏暗、有对对 理模式 对 对 ◦ 拓扑和几何 ( 表面法向 ) p
  • 21.Lambertian 漫反射模型  为了渲染一个漫射曲面: ◦ 表面的法向 ◦ 表面的漫反射率 ◦ 光源的位置和强度 L Rd  cos cos l  n d • • Lambert 定律:若 l 和 n 是单位向量 漫反射对对 可定义 对 对 对对 : I d Ld kd (l  n ) • k d为漫 Ld 为漫射颜色 反射系数,  x
  • 22.Phong 高光模型 Phong 模型是一个光滑表面的经验公式--它也是一个局部光 照明模型,然而却能部分地模拟出全局效果。  镜面表面与它的反射系数高度相关,即,反射的光照度极大地 依赖于出射方向。 
  • 23.Phong 高光模型 I s k s Ls cos    : 高光系数( Phong 指数)ks:对 面 反射系数 x cosine 函数给出的反射照度
  • 24.Lambertian 模型与 Phong 模型对比 Lambertian Phong
  • 25.泛光项  被泛光照射的物体在各个方向反射出同样的光亮度  等价于对场景每个点赋予一个亮度 La 不同对 对 对 的泛光 对对 I d La k a Ka 是泛光被反射的比例 I La k a  I rest
  • 26.Phong 光照明模型 • 包括 : – Lambertian 漫反射模型 – Cosine 角度的对对 面反射 对 对 – 泛光项 • 依赖于四个向量 :  p 是表面某点  l 到光源的方向  n 表面法向  v 到视点的向量  r 反射方向
  • 27.Phong 模型集成 I  ( I a  I d  I s )  I A i IA 是全局泛光项,添加到每个点。 Ia 是某个光 源的泛光项 。 项
  • 28.材质属性  对景 属性 中的物体必 对对定义它的漫射、 对 对 对 对 对 对 对对面和泛光 对对 对  k a : ambient reflectance  k : diffuse reflectance  Surface Data  d  k s : specular reflectance   : phong exponent  每个反射系数项 (ka, kd, ks) 表示入射光经过光与材质作 用以后出射的比例  Phong 指数则反映了物体的光滑程度(高光)
  • 29.增加镜面反射率 增加高光系数 增加漫反射系数
  • 30.远距离光源 渲染计算通常计算从表面任意一点到光源的方向 如果光源无限对对 ,所有的向量是平行的(如日光) 对对 对对 对对对 对对对 对对 对对 对对地 位置光源 用光照方向  x  y p0   z   1 方向光源 :  x  y p0   z   0
  • 31.光源衰减  需要考虑光线在传播过程中 出现的衰减 I La k a  f att I d k d ( N  L) a=b=0; c=1 a=b=0.25; c=0.5 a=0; b=1; c=0 f att  1 a  bd L  cd L 2
  • 32.DirectX 中光照 当使用灯光时,不再自己指定顶点的颜色; Direct3D 中每个顶点都通过灯光引擎来计 算顶点颜色,该计算是基于定义的灯光资源 ,材质以及灯光资源关心的表面方向。通过 灯光模型计算顶点颜色会得到更真实的场景。
  • 33.DirectX 中光照 灯光组成 材质 顶点法线 光源
  • 34.灯光对 对 成     在 Direct3D 灯光模型中,灯光是通过灯光资源的三个成员之 一来照射的,即有三种灯光。 环境光( Ambient Light )——这种类型的灯光将被其他所有表 面反射且被用在照亮整个场景。例如,物体的各部分都被照亮, 对于一个角度,甚至穿过不在光源直接照射的地方他们都能被照 亮。环境光的使用是粗略的,便宜的,它模仿反射光。 漫反射( Diffuse Reflection )——这种灯光按照特殊方向传播。 当它照射到一个表面,它将在所有方向上均匀的反射。因为漫射 光在所有方向上都均匀的反射,被反射的光线将到达眼睛而与观 察点无关,因此我们不必为观察者考虑。因而,漫射光仅仅需要 考虑灯光方向和表面的姿态。这种灯光将成为你的资源中照射的 普通灯光。 镜面反射( Specular Reflection )——这种灯光按照特殊方向 传播。当它照射到一个表面时,它严格地按照一个方向反射。这 将产生一个明亮的光泽,它能在某角度被看见。因为这种灯光在 一个方向反射。明显的观察点,必须考虑灯光的方向和表面姿态 ,且必须按照镜面灯光等式来考虑。镜面灯光被用在物体上产生 高光的地方,这种光泽只有在灯光照射在磨光的表面上才会产生 。
  • 35.灯光组成 镜面光比其他灯光类型要求更多的计算;因 此, Direct3D 提供了一个开关选择。实际 上,它默认是被关闭的;要使用镜面光必须 设置 D3DRS_SPECULARENABLE 渲染状 态。 Device->SetRenderState(D3DRS_SPECULARENABLE, true);
  • 36.灯光组成 每一种灯光都是通过 D3DCOLORVALUE 结构或者描述灯光 颜色的 D3DXCOLOR 来描绘的。例如 : D3DXCOLOR redAmbient(1.0f, 0.0f, 0.0f, 1.0f); D3DXCOLOR blueDiffuse(0.0f, 0.0f, 1.0f, 1.0f); D3DXCOLOR whiteSpecular(1.0f, 1.0f, 1.0f, 1.0f);
  • 37.材质 在现实世界中我们看到的物体颜色将由物体 反射回来的灯光颜色来决定。比如,一个红 色的球是红色的,因为它吸收所有的灯光颜 色除了红色光。红色光是被球反射回来进入 我们眼睛的,因此我们看到的球是红色 的。 Direct3D 通过我们定义的物体材质来 模拟这些所有的现象。材质允许我们定义表 面反射灯光的百分比。在代码中通过 D3DMATERIAL9 结构描述一个材质。
  • 38.材质 typedef struct _D3DMATERIAL9 { D3DCOLORVALUE Diffuse, Ambient, Specular, Emissive; float Power; } D3DMATERIAL9; 指定此表面反射的漫射光数量。  Ambient—— 指定此表面反射的环境光数量。  Specular—— 指定此表面反射的镜面光数量  Emissive—— 对个 是被用来 对对表面添加 对 对 对 对对色,它 对对 使得物体看起来就象是它自己对 出的光一 对对对对对对 。  Power—— 指定锐利的镜面高光;它的值是高 光的锐利值。  Diffuse——
  • 39.材质 想得到一个红色的球。我们将定义球 的材质来只反射红光吸收其他颜色的所 有光: D3DMATERIAL9 red; ::ZeroMemory(&red, sizeof(red)); red.Diffuse = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f); // red red.Ambient = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f); // red red.Specular = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f); // red red.Emissive = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f); // no emission red.Power = 5.0f;
  • 40.顶点法线 面法线( face normal )是描述多边 形表面方向的一个向量
  • 41.顶点法线 顶点法线( Vertex normals )也是 基于同样的概念,但是我们与其指定每 个多边形的法线,还不如为每个顶点指 定
  • 42.顶点法线 Direct3D 需要知道对 点法 对对对对 以便它能 对对对对对 确 定灯光照射到物体表面的角度,并且一旦计 算了每个顶点的灯光, Direct3D 需要知道 每个顶点的表面方向。注意顶点法线不一定 和面法线相同。球体 / 环形物就是很好的实 物例子,它们的顶点法线和三角形法线是不 相同的
  • 43.顶点法线 顶点结构 struct Vertex { float _x, _y, _z; float _nx, _ny, _nz; static const DWORD FVF; } const DWORDVertex::FVF= D3DFVF_XYZ D3DFVF_NORMAL; 作为一个简单的物体比如立方体和球体,我 们能够通过观察看见顶点法线。对于更多复 杂的网格,我们需要一个更多的机械方法。
  • 44.顶点法线 当用三角形近似表示曲面时,使用面 法线作为顶点法线不能表现一个平滑的 结果。一个更好的方法是找到顶点法线 的平均法线。为了找到顶点 v 的顶点法 线 vn ,我们找到网格模型中所有三角 形的面法线记为顶点 v 。 vn 是通过计 算他们的平均面法线得到的。
  • 45.光源 支持三种对 型的光源: 对 对对对 对 点光源——对 种 光源在世界坐 对 对对 中有 一个位置且向所有方向上都照射光线。 Direct3D
  • 46.光源 方向光源——这种光源没有位置但是 向指定方向发出平行光线。
  • 47.光源 聚光灯——这种类型的光源和手电筒 的光类似;它有位置并且发出的光在指 定方向上按照圆锥形照射。这个圆锥形 有两个角度, θ 和 φ 。角度 θ 描述内 圆锥, φ 描述外圆锥。
  • 48.光源  在代码中一个灯光资源是通过 表现的。 D3DLIGHT9 结构来 typedef struct _D3DLIGHT9 { D3DLIGHTTYPE Type; D3DCOLORVALUE Diffuse; D3DCOLORVALUE Specular; D3DCOLORVALUE Ambient; D3DVECTOR Position; D3DVECTOR Direction; float Range; float Falloff; float Attenuation0; float Attenuation1; float Attenuation2; float Theta; float Phi; } D3DLIGHT9;
  • 49.光源            Type—— 定义灯光类型,我们能够使用下面三种类型之一: D3DLIGHT_POINT, D3DLIGHT_SPOT, D3DLIGHT_DIRECTIONAL Diffuse—— 此光源发出的漫射光颜色。 Specular—— 此光源发出的镜面光颜色。 Ambient—— 此光源发出的环境光颜色。 Position—— 用一个向量来描述的光源世界坐标位置。这个值对于灯光的方 向是无意义的。 Direction—— 用一个向量来描述的光源世界坐标照射方向。这个值不能用 在点光源上。 Range—— 灯光能够传播的最大范围。这个值不能比大。且不能用于方向光 源。 Falloff—— 这个值只能用在聚光灯上。它定义灯光在从内圆锥到外圆锥之间 的强度衰减。它的值通常设置为 1.0f 。 Attenuation0, Attenuation1, Attenuation2—— 这些衰减变量被用来定 义灯光强度的传播距离衰减。它们只被用于点光源和聚光灯 上。 Attenuation0 定义恒定衰减, Attenuation1 定义线性衰 减, Attenuation2 定义二次衰减。适当的使用这个公式, D 是代表到光源 的距离, A0,A1,A2 与 Attenuation0 , 1 , 2 相匹配。 Theta—— 只用于聚光灯;指定内圆锥的角度,单位是弧度。 Phi—— 只用于聚光灯;指定外圆锥的角度,单位是弧度。
  • 50.Q&A? …