数据绑定

使用 SasHostParameterValue 集合 来定义主机应用程序值的集合,以及它们向效果公开的类型和成员。 在效果文件中使用 SasBindAddress 批注将效果参数与其在主机应用程序中的对应参数相关联。

SasHostParameterValue 集合

SasHostParameterValue 是使用效果文件 (.fx) 语法定义的。 虽然语法与效果文件语法非常相似,但存在一些差异。 例如,对象类型(如 texture2d、采样器和字符串)在实际效果文件中无效,但在 SasHostParameterValue 中有效。 只要主机应用程序符合以下说明,就可以以任何方式实现 SasHostParameterValue;实际定义位于 DXSAS 标准效果中,包括文件 ([SDK 根]/Utilities/Source/Sas/Sas.fxh) 。

请注意,SasHostParameterValue 中的数组(如 Lights 或 Cameras)的长度不受限制。 这意味着效果可以绑定到这些数组中的任何任意索引,在无法提供应用程序值的情况下,主机应用程序必须提供有意义的默认值。

某些类型和常量需要在 DXSAS 标准包含中定义,如标准包含的定义中所述。 这允许效果轻松地将 SasHostParameterValue 中的聚合值绑定到结构化效果参数。

SasHostParameterValue 集合 类型 成员
时间 FLOAT Sas.Time.Now
FLOAT Sas.Time.Last
int Sas.Time.FrameNumber
环境映射 textureCUBE Sas.EnvironmentMap
摄像头 SasCamera Sas.Camera
float4x4 Sas.Camera.WorldToView
float4x4 Sas.Camera.Projection
float2 Sas.Camera.NearFarClipping
浅色 SasAmbientLight AmbientLight[ZeroOrMore];
int Sas.NumAmbientLights
SasAmbientLight DirectionalLight[ZeroOrMore];
int Sas.NumDirectionalLights
SasAmbientLight PointLight[ZeroOrMore];
int Sas.NumPointLights
SasAmbientLight SpotLight[ZeroOrMore];
int Sas.NumSpotLights
Shadow float4x4 Sas.Shadow[ZeroOrMore]。WorldToShadow
texture2D Sas.Shadow[ZeroOrMore]。ShadowMap
骨架 float4x4 Sas.Skeleton.MeshToJointToWorld[OneOrMore]
int Sas.Skeleton.NumJoints

 

时间

主机应用程序的虚拟时钟或时间值。 成员包括:

  • Sas.Time.Now - 将呈现效果时主机应用程序虚拟时钟的值。
  • Sas.Time.Last - 上一个呈现处的 Now 值。
  • Sas.Time.FrameNumber - 每个呈现的帧递增一次的计数器值。

效果必须正确处理这样一个事实,即这些成员的值可能会在极长的执行时间内环绕。 Now 和 Last 可能具有非常大的值。

环境映射

三次环境映射。 如果效果尝试绑定到 Sas.EnvironmentMap,主机应用程序必须提供有效的多维数据集纹理。

照相机

当前正在渲染的相机。 成员包括:

  • Sas.Camera.WorldToView - 相机的复合世界视图矩阵。
  • Sas.Camera.Projection - 相机的投影矩阵。
  • Sas.Camera.NearFarClipping - 近距和远距剪辑平面的值。

一个或多个场景灯。 光的集合声明为数组,其中:

  • 颜色 - RGB 颜色。 默认值为 (0,0,0)。
  • 方向 - 光线方向。 默认值为 (0,0,0)。
  • 范围 - 与光线对场景没有影响的光线之间的距离。 默认值为 0。
  • Theta - 聚光灯的内锥角,以弧度测量。 默认值为 0。
  • Phi - 聚光灯的外锥角,以弧度测量。 默认值为 0。

光数必须设置为绑定到关联数组的光数。 效果可以选择忽略光的数量,并绑定到其中一个光阵列的任何元素。 因此,主机应用程序必须为数组中灯数以外的元素提供有效的绑定。

ZeroOrMore 表示数组可能具有任意数量的元素。

Shadow

阴影缓冲区包括:

  • WorldToShadow - 矩阵数组。
  • ShadowMap - 2D 纹理文件。

ZeroOrMore 表示数组可能具有任意数量的元素 (零表示空数组) 。

效果将声明采样器,如下所示:

texture2D Shadow 
<
  string SasBindAddress = "Sas.Shadow[0].ShadowMap";
>;

sampler ShadowSampler = shadow_sampler(Shadow);

骨架

构成当前呈现对象的帧集。 帧示例包括骨骼和转换。 这包括:

  • MeshToJointToWorld - 矩阵数组。
  • NumJoints - 骨架中的关节数。

OneOrMore 表示数组至少有一个,并且可能包含任意数量的元素。

该定义支持使用具有相同解释的 SasHostParameterValue 集合 值集的刚性网格对象和皮肤网格对象。

SasBindAddress

此批注将添加到效果文件的顶部,以将效果参数与其 在 SasHostParameterValue 集合中定义的相应参数相关联。 注释的声明如下所示:

string SasBindAddress = "SasHostParameterValue";

此示例将效果世界矩阵绑定到 MeshToJointToWorld 矩阵:

float4x3 World
<
  string SasBindAddress = "Sas.Skeleton.MeshToJointToWorld[0]";
>;

此批注告知主机应用程序,它需要使用 MeshToJointToWorld 矩阵中的数据设置效果世界矩阵的值。

绑定地址注释语法的定义与 ID3DXEffect 用于获取和设置效果参数的语法非常相似。 DXSAS 语法和 ID3DXEffect 方法之间的唯一区别是添加了星号索引标记。 下面是使用星号索引的另一个示例:

float3 LightColors[6]
<
  string SasBindAddress = "Sas.Light[*].Color";
>;

星号索引标记表示,在这种情况下,特定主机环境值数组的所有元素 (颜色,) 应绑定在关联的参数中。 多个星号索引标记允许效果绑定到结构数组的子元素,而无需绑定整个结构本身。 此示例将前六盏灯的颜色值绑定到效果参数。

DirectX 标准批注和语义参考