《Introduction to 3D Game Programming with DirextX 12》
Introduction to lighting,cube mapping,normal mapping and shadow mapping
Lambertamp;Rsquo;s cosine law
we can think of light as a collection of photons traveling through space in a certain direction. Each photon carries some(light) energy. The amount of (light) energy emitted per second is called radiant flux. The density of radiant flux per area (called irradiance) is important because that will determine how much light an area on a surface receives (and thus how bright it will appear to the eye). Loosely, we can think of irradiance as the amount of light striking an area on a surface, or the amount of light passing through an imaginary area in space.
Diffuse lighting
Consider the surface of an opaque object. When light strikes a point on the surface, some of the light enters the interior of the object and interacts with the matter near the surface. The light will bounce around in the interior, where some of it will be absorbed and the remaining part scattered out of the surface in every direction; this is called a diffuse reflection. For simplification, we assume the light is scattered out at the same point the light entered. The amount of absorption and scattering out depends on the material; for example,wood, dirt, brick, tile, and stucco would absorb/scatter light differently(which is why the materials look different). in our approximation for modeling this kind of light/materials interaction, we stipulate that the light scatters out equally in all directions above the surface ; consequently, the reflected light will reach the eye no matter the viewpoint (eye position). therefore, we do not need to take the viewpoint into consideration(i.e.,the diffuse lighting calculation is viewpoint independent), and the color of a point on the surface will always look the same no matter the viewpoint.
Ambient lighting
As stated earlier, our lighting model does not take into consideration indirect light that has bounced off other objects in the scenes, however, much light we see in the real world is indirect. For example, a hallway connected to a room might not be in the direct line of site with a light source in the room, but the light bounces off the walls in the room and some of it may make it into the hallway, thereby lightening it up a bit. As a second example, suppose we are sitting in a room with a teapot on a desk and there is one light source in the room. Only one side of teapot is in the direct line of site of light source; nevertheless, the backside of the teapot would not completely black. This is because some light scatters off the walls or other objects in the room and eventually strikes the backside of the teapot.
specular lighting
We used diffuse lighting to model diffuse reflection, where light enters a medium, bounces around, some light is absorbed, and the remaining light is scattered out of the medium in every direction. A second kind of reflection happens due to the fresnel effect, which is a physical phenomenon. When light reaches the interface between two media with different indices of refraction some of the light is reflected and the remaining light is refracted. The index of refraction is a physical property of a medium that is ratio of the speed of light in a vacuum to the speed of light in the given medium. We refer to this light reflection process as specular reflection and the reflected light as specular light.
If the refracted vector exits the medium(from the other side) and enters the eye, the object appears transparent. That is, light passes through transparent objects. Real-time graphics typically use alpha blending or a post process effect to approximate refraction in transparent objects, which we will explain later in this book, for now, we consider only opaque objects.
For opaque objects, the refracted light enters the medium and undergoes diffuse reflectance. So we can see from figure 8.14b that for opaque objects, the amount of light that reflects off a surface and makes it into the eye is a combination of body reflected(diffuse) light and specular reflection. In contrast to diffuse light, specular light might not travel into the eye because it reflects in a specific direction; that is to say, the specular lighting calculation is viewpoint dependent. This means that as the eye moves about the scene, the amount of specular light it receives will change.
Cube mapping
The idea of cube mapping is to store six textures and to visualize them as the faces of a cube-hence the name cube map-centered and axis aligned about some coordinate system. Since the cube texture is axis aligned, each face corresponds with a direction along the three major axes; therefore, it is natural to a reference a particular face on a cube map based on the axis direction ( X,-X, Y,-Y, Z,-Z) that intersects the face.
In Direct3D, a cube map is represented by a texture array with six element such that 1.index 0 refers to the X face, 2.index 1 refers to the -X face, 3.index 2 refers to the Y face, 4.index 3 refers to the -Y face, 5.index 4 refers to the Z face, 6.index 5 refers to the -Z face.
In contrast to 2D texturing, we can no longer identify a texel with 2D texture coordinates. To identify a texel in a cube map, we use 3D texture coordinates, which define a 3D lookup vector v originating at the origin. The texel of the cube map that v intersects(see figure 18.1) is the texel corresponding to the 3D coordinates of v. the concepts of texture filtering discussed in chapter9 applies in the case v intersects a point between texel samplers.
Environment maps
The primary application of cube maps is environment mapping. The idea is to position a camera at the center of some object O in the scene with a 90 degree filed of view angle (both vertically and horizontally). then have the camera look down the positive x-axis, nagative x-axi
全文共20183字,剩余内容已隐藏,支付完成后下载完整资料
光照,立方体贴图,阴影贴图,法线贴图技术简介
lambert正余弦法则
我们可以把光看作是在一定方向上穿过空间的光子的集合。每个光子携带一些(光)能量。每秒发出的(光)能量称为辐射通量。每个区域的辐射通量密度(称为辐照度)是很重要的,因为这将决定一个表面上的一个区域接收到多少光(因此它会对眼睛产生多大的光亮)。简言之,我们可以把辐照度看作是在一个表面上的某个区域的光的数量,或者说是通过空间中的一个假想区域的光的数量。
漫反射光
考虑不透明物体的表面。当光照射到表面上的某一点时,一些光线进入物体内部并与表面附近的物质相互作用。光在内部会反弹,其中一些将被吸收,其余部分分散在各个方向的表面上,这称为漫反射。为了简化,我们假设光是在光线进入的同一点散射出去的。吸收和散射的量取决于材料;例如,木材,泥土,砖,瓦,灰泥的吸收/散射光的不同(这就是为什么材料看上去不同)。在我们对这种光/材料相互作用的近似建模中,我们规定光在表面上的所有方向上都均匀地散射,因此,不管视点(眼睛位置),反射光都会到达眼睛。因此,我们不需要考虑这个观点(即漫射光计算是独立于视点的),而且不管视点如何,表面上的点的颜色总是一样的。
环境光
如前所述,我们的照明模型没有考虑到从场景中其他物体反弹出来的间接光,然而,我们在现实世界中看到的许多光线是间接的。例如,一个与房间相连的走廊可能不在房间的光源的直接位置上,但是光线从房间的墙上反弹出来,其中一些可以进入走廊,从而使它稍微亮一点。作为第二个例子,假设我们坐在一个桌子上有茶壶的房间里,房间里有一个光源。茶壶的一侧只在光源位置的直线上,但茶壶的背面不会完全是黑色的。这是因为一些光线分散在房间的墙壁或其他物体上,最终撞击到茶壶的背面。
镜面高光
我们使用漫射光来模拟漫反射,光线进入一个介质,反射到周围,一些光线被吸收,剩下的光分散在各个方向的介质中。第二种反射是由于菲涅耳效应而产生的,这是一种物理现象。当光线到达不同折射率的两个介质之间的界面时,一些光被反射,其余的光线被折射。折射率是一种介质的物理性质,即在给定的介质中,真空中的光的速度与光的速度之比。我们将这种光反射过程称为镜面反射和反射光作为镜面光。
如果折射矢量离开介质(从另一边)进入眼睛,物体就会出现透明。也就是说,光线穿过透明物体。实时图形通常使用alpha混合或后处理效果来近似透明物体中的折射,我们稍后将在本书中解释,现在我们只考虑不透明物体。
对于不透明物体,折射光线进入介质并进行漫反射。所以我们可以看到从图8.14b,不透明的物体,光的量反映了一个表面,使它进入眼睛是一个组合的物体反射光和镜面反射(漫反射)。与漫射光相反,镜面反射光不可能进入眼睛,因为它反映在一个特定的方向上,也就是说,镜面光照计算是视点相关的。这意味着当眼睛移动到场景周围时,它接收的镜面反射光的数量就会改变。
立方体贴图
立方体贴图的思想是存储六个纹理,并将它们可视化为立方体的面,因此,名称立方体贴图居中,某些坐标系上的轴对齐。由于立方体纹理是轴对齐的,所以每一个面都对应于三个主要轴的方向;因此,根据相交的轴方向( x、-x、 y、-y、 z、-z)在立方体图上引用特定的面是很自然的。
在Direct3D,立方体贴图是由一个六元索引,1.index 0指 X面的纹理,2.index 1指-X的纹理,3.index 2指 Y的纹理,4.index 3指- Y的纹理,5.index 4指 Z的纹理,6.index 5指的是-Z的纹理。与二维纹理,我们不能确定一个二维纹理的纹理坐标。确定在一个立方体贴图纹理,我们使用3D纹理坐标,定义一个三维查找向量V起源于原点。V和立方体贴图相交的纹理即为三维坐标V对应的纹理。这个概念来源于第九章的一个例子。
环境贴图
立方体贴图的主要应用是环境贴图。这个想法是把摄像机放在场景中的某个物体的中心,90度视场角(垂直和水平)。然后镜头往下看X轴的正向,负轴,y轴正向,负y轴,z轴正方向和负,Z轴,和拍照的场景(不包括对象O)从这六个观点。因为视场角是0度,六个图像将从对象O的角度捕获整个周围环境(参见图18.2)。然后我们将这六张周围环境的图像存储在立方体地图中,从而产生名称环境图。换句话说,环境贴图是多维数据集贴图,其中多维数据集将存储环境的周围图像。
上面的描述表明我们需要为每一个使用环境贴图的对象创建一个环境贴图。虽然这将更准确,但它也需要更多的纹理内存。折中的办法是使用一些环境地图,捕捉场景中关键点的环境。然后对象将提取与它们最接近的环境贴图。这简化通常工作在实践中表现很好因为弯曲的物体是很难注意到。图18.2中经常使用环境贴图的另一种简化方法只捕捉遥远的天空和山脉的遥远的“背景”信息。忽略局部场景对象。虽然背景环境图在某种意义上是不完整的,但它在实践中很好地创建了镜面反射。为了捕捉当地的对象,我们将不得不使用Direct3D渲染六幅环境地图;这是18.5中的讨论。在本章的演示中(图18.3),场景中的所有对象共享相同的环境贴图,如图18.2所示。
如果摄像机创建环境贴图图片的坐标轴方向是世界空间坐标轴,那么环境贴图一般与世界空间是相对的。你能够,当然,捕获环境从不同方向(指一个物体的当地空间)。然而,查找向量坐标必须和立方体贴图空间是相对的。
因为立方体贴图只是存储纹理数据,它们的内容可以被艺术家预生成(就像我们使用过的2维纹理一样)。因此,我们不需要去使用实时渲染去计算立方体贴图的图像。那就是说,我们可以用3维世界编辑器创建一个场景,然后在编辑器中提前渲染六个立方体贴图面的图像。对于户外的环境贴图,terragen这个项目是通用的(对于个人使用免费),而且能够创建逼真的户外场景。我们这本书上所创建的环境贴图,正如图18.2所展示,就是用terragen制作的。
立方体贴图总结
- 立方体图由六个纹理组成,我们将其可视化为立方体的面。在Direct3D 12,立方体地图可以通过id3d12resource接口作为一个具有六个元素的数组表示的纹理。在HLSL,立方体贴图由texturecube型代表。确定在一个立方体映射纹理,我们使用3D纹理坐标,定义一个三维查找向量V产生的立体图的中心。立方体的地图纹理,V与对应于V的三维坐标的纹理
- 环境图用六个图像捕获一个点周围的环境。然后可以将这些图像存储在多维数据集图中。借助环境地图,我们可以很容易地对天空进行纹理或近似反射。
- 立方体贴图可以从六个图像使用texassemble工具。然后可以用DDS图像格式保存多维数据集映射到文件。由于多维数据集映射存储了六个2D纹理,这些纹理可以消耗大量内存,所以应该使用压缩的DDS格式。
- 预焙立方体贴图不捕获的对象,在场景中移动或对象不存在时的立体图生成。为了克服这个限制,我们可以在运行时构建多维数据集映射。也就是说,你在场景中的每一帧都是立方体地图的原点,然后在每个坐标轴方向上把场景渲染六次到每个立方体贴图面。由于立方体地图是重建每帧,它将捕捉动画对象和环境中的每一个对象。动态多维数据集映射非常昂贵,它们的使用应该最小化到关键对象。
- 我们可以将渲染目标视图绑定到OM数组中的纹理数组。此外,我们可以同时对纹理数组中的每个数组切片进行渲染。一个渲染目标数组切片是通过设置系统的价值sv_rendertargetarrayindex做分配一个三角形。渲染目标视图到纹理阵列,随着sv_rendertargetarrayindex系统值允许渲染场景一次而不是六次动态生成一个立方体贴图。然而,这种策略并不是总能用对景的剔除来赢得六倍的渲染效果。
渲染场景的深度
阴影贴图算法依赖于渲染场景的深度从光源的角度这本质上是一个变化的渲染到纹理,这是在与13.7.2首次描述。通过“渲染景深”,我们的意思是从光源的视角建立深度缓冲区。因此,在我们从光源的角度渲染场景后,我们将知道最接近光源的像素片段——这样的碎片不可能在阴影中。在这一节中我们回顾一个被称为shadowmap的工具类帮助我们存储从光源的角度场景深度。它只封装了深度/模板缓冲区、必要的视图和视口。用于阴影贴图的深度/模板缓冲区称为阴影贴图。
阴影贴图
阴影贴图算法的思想是将场景的深度从光的视点渲染到一个称为阴影贴图的深度缓冲区。完成之后,阴影贴图将包含从光的角度来看所有可见像素的深度值。(由其他像素遮挡的像素将不在阴影贴图中,因为它们将无法进行深度测试,要么被覆盖,要么从未写过)。
为了从光的观点渲染场景,我们需要定义一个光视图矩阵,它将坐标从世界空间转换到光的空间和一个光投射矩阵,它描述了光在世界上的传播量。这可以是一个截头体体积(透视投影)或盒体积(正投影)。一个截锥体的光体积可以通过在聚光镜中嵌入聚光锥来模拟聚光灯。箱光体积可以用来模拟平行光。然而,平行光现在是有界的,只通过盒子的体积;因此,它可能只触及场景的一个子集(见图20.5)。对于一个击中整个场景(例如太阳)的光源,我们可以使光体积大到足以包含整个场景。
一旦我们建立了阴影贴图,我们就从“玩家”相机的角度渲染场景。对于渲染的每个像素p,我们也从光源计算它的深度,我们用d(p)表示。此外,使用投影纹理样本,我们沿着视线的阴影图从光源到像素p得到的深度值s(p)存储在阴影图;这个值是从光的位置p.然后像素接近光的视线深度,从图20.6中,我们看到一个像素p是影子当且仅当d(p)、s(p)。因此一个像素是在阴影中当且仅当d(p)le;s(p)。
阴影贴图总结
- 后台缓冲区不一定是渲染目标,我们可以渲染到不同的纹理。纹理渲染为GPU在运行时更新纹理内容提供了一种有效的方法。在渲染完纹理后,我们可以将纹理绑定为着色器,并将其贴图到几何体上。许多特效需要渲染纹理功能,如阴影贴图、水模拟和通用GPU编程。
- 用正交投影,看到的是一个立方体盒子(见图20.1),宽度w,高度h,近平面n和平面f,投影线平行于视图空间z轴。这种投影主要用于三维科学或工程应用中,希望在投影后平行线保持平行。然而,我们可以使用正交投影来模拟平行光产生的阴影。
- 投影纹理之所以被称为是因为它允许我们投射纹理到任意的几何形状上,就像幻灯机一样。投射纹理的关键是以每一个像素的纹理来生成纹理,从而使所应用的纹理看起来像是投影到了几何体上。这样的纹理坐标称为投影纹理坐标。通过投影到投影仪的投影平面,得到像素投影纹理坐标,然后将其映射到纹理坐标系中。
- 阴影贴图是一种实时阴影技术,它可以屏蔽任意几何形状(不局限于平面阴影)。阴影贴图的思想是将场景的深度从光的视点渲染到阴影贴图中,因此,在阴影图像之后,阴影图存储从光的角度可见的所有像素的深度。然后,我们从摄像机的角度再次渲染场景,我们使用投影纹理投影阴影贴图到场景中。让s(p)是从阴影贴图投射到像素p上的深度值,让d(p)是光源的像素深度。然后,当d(p)gt;s(p)时p在阴影处;就是说,如果该像素的深度大于投影像素深度s(p),那么必定存在某个像素比p像素更接近光照,从而造成p在阴影处。
- 走样是阴影贴图最大的挑战。阴影图存储最近的可见像素相对于其相关光源的深度。然而,阴影图只有有限的分辨率。所以每个阴影贴图纹理对应的场景的一个地区。因此,阴影图只是从光的角度对场景深度的离散采样。这会导致走样问题,称为阴影瑕疵。利用图形硬件的内在支撑边坡比例偏差(在光栅化渲染状态)是一种常见的策略来解决这个问题。阴影贴图的有限分辨率也会造成阴影边缘的走样。PCF是一种流行的解决方案。用于走样问题的更高级的解决方案是级联阴影图和方差阴影图。
法线贴图
在第9章中,我们引入了纹理贴图,它使我们能够将图像的精细细节贴图到三角形上。然而,我们的正规向量仍然定义在较粗的顶点水平,并在三角形中插值。在本章的一部分中,我们研究了一种流行的方法,用于指定更高分辨率的表面法线。在更高分辨率下指定表面法线增加了照明的细节,但网格几何细节保持不变。
从前一章的立方体贴图演示中考虑图19.1。在锥形柱的镜面高光不看的权利,他们看起来很不自然的光滑相比砖纹理的颠簸。这是因为下面的网格几何形状是光滑的,我们只是在网格几何上(尤其是插值顶点法线)应用颠簸砖块的图像,而不是纹理图像。因此光线与纹理不完全一致。
理想情况下,我们将细化网格几何这么多砖块的实际碰撞和缝隙可以由基本几何体建模。然后灯光和纹理可以保持一致。硬件曲面细分可以帮助在这一领域,但我们仍然需要一种方式来利用细分器产生的顶点指定法线(使用插值法线不增加正常的分辨率)。
因此,我们的目标是找到一种方法来实现动态照明,这样的细节出现在纹理贴图也显示在照明。由于纹理为我们提供了详细的细节,所以很自然地寻找一个纹理贴图解决方案来解决这个问题。图19.2显示了图19.1所示的与法线贴图相同的场景;我们现在可以看到,动态照明与砖纹理更加一致。
考虑一个三维纹理贴图三角形。为了讨论,假设纹理贴图没有失真,换句话说,将纹理三角形贴图到三维三角形只需要刚体变换(平移和旋转)。现在,假设纹理像贴花。所以我们选择贴花,平移它,然后在三角形上旋转。现在,图19.4显示了纹理空间轴与三维三角形的关系:它们与三角形相切,位于三角形的平面内。三角形的面法线N的纹理坐标,我们在这个平面上得到一个基于TBN(切向,副法向,法向)的三维坐标系,我们称之为纹理空间或切空间。注意,切空间一般从三角形到三角形(见图19.5)。
我们总结了法向贴图的一般过程:
1、从一些艺术程序或实用程序中创建所需的法线贴图,并将它们存储在一个图像文件中。从这些文件创建2D纹理,然后初始化程序。
2。每个三角形的切向量T,计算得到预顶点切线向量为每个顶点v在网状的平均网格中的共享顶点v每个三角形的切向量(在我们的演示中,我们使用简单的几何形状,可
全文共5889字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[12109],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。