UDN
Search public documentation:

ImageBasedReflectionsCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

虚幻引擎3主页 > 虚幻引擎3中的DirectX 11 >基于图像的反射
UE3 主页 > 材质 & 贴图 > 基于图像的反射

基于图像的反射


文档变更记录: 由 Daniel Wright 创建。

概述


基于图像的反射是虚幻引擎3中的DirectX 11渲染流程的一个功能。在GDC 2011的Samaritan演示作品中使用这个技术来实施渲染整个场景的HDR反射效果。这个技术通过反射场景中每个像素的近似版本进行工作,这使得它比以前的反射技术(比如场景捕获)效率更高。场景的近似版本主要由4个主要部分组成:

  • ImageReflectionActors (贴图块)
  • 启用了bUseImageReflectionSpecular的光源。
  • 不透明表面呈现的粗糙的静态阴影。
  • 动态物体的动态阴影,围绕ImageReflectionShadowPlane反射。

由所有组件构成的一个场景:

Reflections.jpg

启用基于图像的反射


在游戏的engine.ini文件中,必须把AllowImageReflections和AllowImageReflectionShadowing设置为True。然后,在您想反射的材质上启用bUseImageBasedReflections,并放置一些ImageReflectionActors,以便有一些可以反射的东西。

从空关卡中进行快速操练

  • 添加一些静态网格物体或BSP
  • 创建一个新材质,把值为1的Constant节点连接到Specular输入端,启用bUseImageBasedReflections,并把该材质分配给场景中的网格物体。
  • 确保编辑器位于Lit(带光照)模式,如果没有光源,它将自动切换到Unlit(无光照)模式,那么反射现象就不会出现。
  • 从Actor Classes(Actor类别)选卡中拖拽一个ImageReflectionActor,并将其放到您刚才放置的几何体的顶部。
  • 对齐相机,以便您可以看到反射效果。默认情况下,ImageReflectionActor是单面的,所以您必须选转向机到另外一侧来查看反射效果。

注意: ImageReflectionActor是半透明对象,所以只有启用半透明选择时才能选中它们,默认没有启用半透明选择。控制半透明选择的按钮在编辑器工具栏上的'distance to far clipping plane(到远裁平面的距离)'滑块的右侧。

特点


基于图像的反射有以下特点:

  • HDR反射
  • 任何表面都可以反射,不限于平面或点。
  • 支持平面上的光泽变化。这对于类似于潮湿的马路这样的东西是有用的,这样水坑的地方会有镜像反射,而路面的其他地方产生更加有光泽的反射。
  • 各项异性光泽 -反射光线会分布在多个方向。
  • 动态组件 - 除了静态阴影之外的所有部分的反射都可以在运行时修改。

材指属性


以下材质属性影响图像反射:

  • bUseImageBasedReflections - 启用或禁用这个材质上的图像反射。
  • ImageReflectionNormalDampening - 阻尼抑制图像反射所使用的法线。这是有用的,因为对于漫反射光照来说潮湿表面的法线趋向于凸凹效果,而对于高光反射来说潮湿表面的法线较为平滑。该值越大法线越平滑(更像底下的顶点法线),值为1意味着没有阻尼抑制,反射直接使用应用的法线。
  • SpecularColor(高光颜色) - 缩放反射分布。
  • SpecularPower(高光次幂) - 控制材质的光泽度。

ImageReflectionActors


ImageReflectionActors是基于图像反射制作反射效果的场景的最基本元素。这会定义一个贴图块,它具有几个其他属性:

  • bEnabled - 是否启用反射。该项可以通过Matine切换轨迹进行控制。
  • bTwoSided - 反射效果是否可以从两侧都能看到。
  • ReflectionColor - RGB控制ReflectionTexture的颜色值, A控制亮度。该项可以通过Matine LinearColor(线性颜色)轨迹进行控制。
  • ReflectionTexture -在反射时应用到这个方块上的贴图。

在世界中一次最多可以启用85个ImageReflectionActor。如果多余85个,那么有些光源将不会被渲染。启用的ImageReflectionActor的数量越多,图像反射渲染时的性能消耗就越大,即使当 ImageReflectionActor已经不在屏幕中时这些消耗仍然存在(因为当它们在观察者后面时反射效果仍然可以看到)。

ReflectionTexture(反射贴图)限制

由于ReflectionTexture属性和D3D 11贴图数组结合使用,所以其属性有一些限制。这些限制是:

  • 尺寸必须是1024 * 1024。
  • 格式必须是DXT5。
  • 贴图组必须是TEXTUREGROUP_ImageBasedReflection。这个贴图组具有特殊的mip生成设置,用于模糊mip贴图,以便当放大它们时它们不会呈现出斑驳的块状。

ReflectionTexture的RGB代表卡片的自发光程度,alpha是不透明程度。

左侧是一个ImageReflectionActor,显示光泽度是由到反射点的距离决定的。右侧,反射是各向异性的,在垂直方向上有延伸。

6NoAniso.jpg 6Aniso.jpg

以下场景显示了任何表面都可以具有图像反射,该表面不一定必须是地平面。光泽度受到材质高光次幂和到反射体的距离的影响,这也是为什么地面上的反射比墙壁上的反射效果更有光泽的原因。

AnySurface.jpg

ImageReflectionSceneCapture(图像反射屏幕截图)

ImageReflectionSceneCapture基本上就是一个捕获一部分场景到其贴图中的ImageReflectionActor,它不需要用户手动地指出反射贴图。这些对于创建整个建筑物表面或者一些没有自发光贴图的对象上的反射效果是非常有用的。场景捕获截图将会在光照构建过程中更新;或者您可以通过右击并选择‘更新’来强制地更新它,这样就不必构建光照了。

属性

  • DepthRange(深度范围) - 控制捕获到贴图中的世界空间深度范围。当选中该项时,将会有一个线框显示当前范围的大小。
  • ColorRange(颜色范围) - 用于把HDR源值放到LDR生成贴图中。默认值为4,这意味着在捕获的贴图中可以呈现的最大的颜色值是4。

关卡中有一个单独的ImageReflectionSceneCapture,显示它捕获了在其后面的建筑物表面。线框指出了将要捕获的深度范围。

SceneCapture.jpg

环境贴图


WorldInfo有一些属性,允许指出让反射光来自关卡中无限远的半球。这对于添加那些看上去像来自无限远处的环境反射是有用的,并且可以呈现出阴影方法所提供的细节。

  • ImageReflectionEnvironmentTexture - 图像反射的全景环境贴图。应该把贴图展开,以便地平线沿着底部(v=0),世界空间中的竖直向上沿着顶部(v = 1)。贴图的u方向对应着围绕世界坐标轴Z的旋转。
  • ImageReflectionEnvironmentColor - 和ImageReflectionEnvironmentTexture相乘的颜色,alpha控制亮度。
  • ImageReflectionEnvironmentRotation - 使的环境贴图围绕世界坐标轴Z旋转的角度,以度数为单位。

环境贴图示例。

EnvironmentTexture.jpg

光源反射


光源有一个新属性bUseImageReflectionSpecular。当启用该属性时,将按照所提供的方式反射光源,这些方式包括:

  • 长的条纹高光,就像您在雨夜中所看到的光线效果。
  • 不受到光源光源影响半径区间限制的高光。
  • 节约能量的高光 (较有光泽的区域具有较暗的反射效果,类似于镜面的区域具有较亮的反射效果)。

在世界中一次最多可以启用85个启用bUseImageReflectionSpecular的光源。如果多余85个,那么有些光源将不会被渲染。光源还有个属性ReflectionSpecularBrightness,它可以控制光源反射的亮度。

在所有街灯都启用了bUseImageReflectionSpecular的场景中。注意,较远的光源的反射较暗,但仍然是可见的。高光会受到路面的高光次幂的影响,路面材质越亮高光越暗(节约能量)。

Streaky.jpg

静态阴影


反射的阴影要求防止光照渗透。生成反射的阴影的最主要的方法是场景中的不透明、静态表面的预计算方法,该方法在光照构建过程中由Lightmass生成。要想使用这些阴影,需要在WorldInfo中启用bEnableImageReflectionShadowing,确保有一个lightmass重要体积包围着您想为其添加阴影的区域和建筑物。您可以通过在组件中禁用bCastStaticShadow来排除某些单独的对象,使它们不在反射图像中产生阴影。

这个简单的场景显示了静态阴影的操作步骤。阴影半影尺寸是由从此处到反射点的距离和材质光泽度决定的。

StaticShadowing.jpg

动态阴影


移动的actor类型(InterpActor、SkeletalMeshActor等)并不适用于静态阴影方法,所以它们看上去像浮在地面上一样。反射所支持的唯一的动态阴影是通过平面反射来实现的,您可以通过放置并排列ImageReflectionShadowPlane actor来指定。这个方法的最常用的情况是把平面放在地面上。

左侧,场景没有任何动态对象的阴影。右侧,沿着路面排列了一个ImageReflectionShadowPlane,动态对象的阴影投射到了地面上。

3Unshadowed.jpg 3Shadowed2.jpg