灯和材料 (Direct3D 9)
灯光用于照亮场景中的对象。 启用照明后,Direct3D 会基于以下组合计算每个对象顶点的颜色:
注意
此部分仅适用于固定函数管道。 可编程着色器显式执行所有照明。
- 关联的纹理图中的当前材料颜色和纹素。
- 顶点的漫射和反射颜色(如果指定)。
- 场景中的光源或场景的环境光级别产生的光的颜色和强度。
使用 Direct3D 照明和材料时,允许 Direct3D 处理照明的详细信息。 如果需要,高级用户可以自行执行照明。
使用照明和材料的方式在呈现场景的外观上有很大的不同。 材料定义光如何从表面反射。 直接光和环境光级别定义反射的光。 如果启用了照明,则必须使用材料来呈现场景。 渲染场景不需要灯光,但在没有光线的情况下呈现的场景中的详细信息不可见。 最多呈现一个未亮亮的场景会导致场景中对象的剪影。 对于大多数目的,这还不够详细。
直接光与环境光
虽然直接和环境光照亮场景中的对象,但它们彼此独立,但它们具有非常不同的效果,并且它们要求你以完全不同的方式与他们合作。
直接光就是:直接。 直接光线始终具有方向和颜色,它是着色算法的一个因素,如 Gouraud 底纹。 不同类型的灯光以不同的方式发出直接光,从而产生特殊的衰减效果。 通过调用 IDirect3DDevice9::SetLight 方法,为直接光创建一组光参数。
环境光实际上在场景中随处可见。 你可以将其视为填充整个场景的一般光线级别,而不考虑该场景中的对象及其位置。 环境光没有位置或方向,只有颜色和强度。 每个光都会添加到场景中的整体环境光。 使用调用 IDirect3DDevice9::SetRenderState 方法设置环境光级别,将D3DRS_AMBIENT指定为 状态 参数,并将所需的 RGBA 颜色指定为 Value 参数。
环境光颜色采用 RGBA 值的形式,其中每个组件都是介于 0 到 255 之间的整数值。 这与 Direct3D 中的大多数颜色值不同。
可以使用 D3DCOLOR_RGBA 宏生成 RGBA 值。 红色、绿色和蓝色组件组合在一起,使环境光的最终颜色。 alpha 组件控制颜色的透明度。 使用硬件加速或 RGB 仿真时,将忽略 alpha 组件。
Direct3D 光模型与自然
在本质上,当光从源发出时,它将从数百个对象中反射出来,如果不是数千或数百万个对象,然后到达用户的眼睛。 每次反射时,一些光被表面吸收,一些光线散落在随机方向,其余部分则转到另一个表面或用户的眼睛。 此过程一直持续到光线减少到无或用户感知光。
显然,完美模拟光的自然行为所需的计算过于耗时,无法用于实时 Direct3D 图形。 因此,考虑到速度,Direct3D 光模型近似于光在自然世界中的工作方式。 Direct3D 在红色、绿色和蓝色组件方面描述了光,这些组件组合在一起以创建最终颜色。
在 Direct3D 中,当光线从表面反射时,浅色在数学上与表面本身交互,以创建最终在屏幕上显示的颜色。 有关 Direct3D 使用算法的具体信息,请参阅 照明数学(Direct3D 9)。
Direct3D 光模型将光通用化为两种类型:环境光和直接光。 每个属性都有不同的属性,并且每个属性都以不同的方式与表面的材料进行交互。 环境光是散射的光,以至于其方向和源不确定:它在任何地方保持低强度水平。 摄影师使用的间接照明是环境光的良好例子。 Direct3D 中的环境光与本质上一样,没有真正的方向或源,只有颜色和强度。 事实上,环境光级别与生成光线的场景中的任何对象完全无关。 环境光不会导致反射。
直接光是由场景中的源生成的光;它始终具有颜色和强度,并按指定方向行驶。 直接光与表面的材料交互以创建反射高光,其方向用作着色算法的一个因素,包括古鲁德底纹。 当直接光反射时,它不会对场景中的环境光水平造成影响。 生成直接光的场景中的源具有不同的特征,这些特征会影响它们照亮场景的方式。
此外,多边形的材料具有影响多边形反射其接收光的方式的属性。 设置一个反射特征,描述材料如何反射环境光,并设置单个特征以确定材料的反射和漫射反射。 有关详细信息,请参阅 材料(Direct3D 9)。
灯光和材料的颜色值
Direct3D 以四个分量(红色、绿色、蓝色和 alpha)来描述颜色,这些组件组合成最终颜色。 D3DCOLORVALUE C++结构定义为包含每个组件的值。 每个成员都是一个浮点值,通常范围为 0.0 到 1.0(含)。 尽管灯光和材料都使用相同的结构来描述颜色,但结构中的值由每个结构使用略有不同。
光源的颜色值表示它发出的特定光组件的数量。 由于灯光不使用 alpha 分量,因此只有颜色的红色、绿色和蓝色分量是相关的。 可以在投影电视上将这三个组件可视化为红色、绿色和蓝色镜头。 每个镜头可能关闭(适当成员中的 0.0 值),它可能尽可能明亮(1.0 值),也可能是介于两者之间的一些级别。 通过镜头的颜色组合在一起,使光的最终颜色。 R(1.0)、G(1.0)、B(1.0)等组合创建白色光,R(0.0)、G(0.0)、B(0.0)根本不发出光。 可以发出只发出一个组件的光,从而产生纯红色、绿色或蓝光;或者,光可以使用组合发出黄色或紫色等颜色。 甚至可以设置负色分量值以创建一个“深色”,该“深色”实际上会从场景中移除光线。 或者,可以将组件设置为大于 1.0 的一些值,以创建极亮的光。
另一方面,使用材料时,颜色值表示用该材料呈现的表面反射了多少光组件。 颜色成分为 R(1.0)、G(1.0)、B(1.0)、A(1.0)的材料反映了所有来临的光。 同样,带有 R(0.0)、G(1.0)、B(0.0)、A(1.0)的材料反映了指向它的所有绿灯。 材料具有多个反射值来创建各种类型的效果。
其他信息包含在:光类型(Direct3D 9)和 光属性(Direct3D 9)。
相关主题