强制转换和转换

在主机应用程序和效果参数之间传输值时,当主机应用程序中的源数据类型 () 与效果参数) 中的目标数据类型 (匹配时,数据将按预期写入。 当数据类型不同时,将发生强制转换,因为源数据已重新排列以适应目标。

DXSAS 定义以下类型转换规则。 这些是效果 (.fx) 和 HLSL 类型转换规则的超集。 DXSAS 还定义了一些 参数值修饰符,这些修饰符 可能会影响从主机应用程序传输到绑定参数的值。

类型强制转换

下表列出了将一种数据类型传输到另一种数据类型时将发生的强制转换:

源类型 目标类型 行为
FLOAT int 向零舍入。
float、int bool 不等于 0 的值(基于与 0 (int) 或 0.0 (float) 的比较)被视为 true,否则该值被视为 false。
int FLOAT
bool int、float False 转换为零。True 将转换为 1。
texture1D、texture2D、texture3D、textureCUBE 纹理 目标纹理被视为源纹理类型。
字符串 texture1D、texture2D、texture3D、textureCUBE 字符串值被视为资源地址,其解析方式与 参数初始化注释相同。 如果无法解析资源地址,则强制转换无效,主机应用程序必须返回错误。 如果资源已正确解析,则表达式的类型被视为与解析资源相同的类型。

 

类转换

除了上述类型转换规则外,DXSAS 还定义了在类类型之间转换所需的转换规则集。 列矩阵 (N x 1) ,行矩阵 (1 x N) ,数值结构被视为向量。

效果矩阵参数和 HLSL 矩阵变量可以定义该值是行主矩阵还是列主矩阵;但是,DirectX API 始终将 D3DMATRIXD3DXMATRIX 视为主要行。

源类 目标类 行为
Scalar Scalar 应用类型转换。
Scalar 向量 应用类型转换中所述的类型转换和转换行为后,将标量源值复制到目标向量的每个组件中。
Scalar Matrix 应用类型转换中所述的类型转换和转换行为后,将标量源值复制到目标矩阵的每个组件中。
Scalar Object 强制转换无效。 主机应用程序必须返回错误。
Scalar 结构 仅当目标结构仅包含数值元素时有效。 如果有效,请在应用类型转换中所述的类型转换和转换行为后,将标量源值复制到目标结构的每个组件中。
向量 Scalar 在应用类型转换中所述的类型转换和转换行为后,目标标量接收源向量的第一个组件的值。
向量 向量 如果目标向量具有比源向量更多的组件,则强制转换无效。 在应用类型转换中所述的类型转换和转换行为后,目标向量接收源向量的最左侧值。 源向量的其余最右部分将丢失。
向量 矩阵 强制转换无效,除非源向量具有与目标矩阵相同的组件数。 如果强制转换有效,则应用矢量到向量强制转换的行为。
向量 Object 强制转换无效。 主机应用程序必须返回错误。
向量 结构 仅当目标结构仅包含数值元素且不包含超出源向量具有组件的元素时有效。 在应用类型转换中所述的类型转换和转换行为后,目标结构的元素接收源向量的最左侧组件。
Matrix Scalar 应用类型转换中所述的类型转换和转换行为后,目标标量接收源矩阵最左上角的值。
Matrix 向量 强制转换无效,除非源矩阵的组件数与目标向量相同。 如果强制转换有效,则应用上述矢量到向量强制转换的行为。
Matrix Matrix 如果目标矩阵的组件多于源矩阵,则强制转换无效。 在应用类型转换中所述的类型转换和转换行为后,目标矩阵接收源矩阵的最左上角值。 源矩阵的其余最右下部组件将丢失。
矩阵 Object 强制转换无效。 主机应用程序必须返回错误。
Matrix 结构 结构的大小必须等于矩阵的大小,结构的所有组件都必须是数值。
Object Scalar 强制转换无效。 主机应用程序必须返回错误。
Object 向量 强制转换无效。 主机应用程序必须返回错误。
Object Matrix 强制转换无效。 主机应用程序必须返回错误。
Object Object 如果对象的类型相同且符合 类型转换中定义的行为,则有效。
结构 Scalar 如果源结构至少包含一个数值成员,则有效。 在应用类型转换中所述的类型转换和转换行为后,目标标量接收源结构的第一个数值成员的值。
结构 向量 源结构必须至少为向量的大小。 第一个分量必须是数值,最大为目标向量的大小。
结构 Matrix 源结构必须至少为向量的大小。 第一个分量必须是数值,最大为目标向量的大小。
结构 结构 目标结构不得大于源结构。 有效的强制转换必须在所有相应的源组件和目标组件之间存在。

 

参数值修饰符

参数修饰符注释向参数添加其他信息,以便可以正确解释参数的数据。 例如,可能需要用规范化数据表示向量,或者长度可以以英寸为单位。 参数值修饰符注释表示此附加信息,以便主机应用程序在将数据传输到效果参数时可以正确转换值。

以下是参数修饰符:

参数值修饰符注释 说明
SasNormalize 指定是否规范化向量。
SasUnits 指定参数的度量单位。

 

SasNormalize

SasNormalize 注释表示,每当分配关联的参数时,它都应是规范化值。 此注释仅影响 float2、float3 和 float4 参数。

string SasNormalize = "Value";

其中 Value 为 True 或 False。

以下是示例:

float3 UpNormal
<
  bool SasNormalize = "True";
>;

SasUnits

效果参数数据以以下单位表示:

string SasUnits = "Value";

其中 Value 为下列值之一:

度量类型 说明
无单位 空字符串 无单位
距离 MM 毫米
cm 厘米
m
km 公里
角度 rad Radians
时间 ms 毫秒
分钟 分钟数
小时 小时
线性速度 mm/秒 毫米/秒
cm/sec 每秒厘米数
m/秒 米/秒
m/hr 米/小时
km/小时 公里/小时
线性加速 mm/sec² 毫米/秒平方
cm/sec² 每秒平方厘米数
m/sec² 米/秒平方
m/hr² 米/小时平方
km/hr² 千米/小时平方
Angular速度 rad/sec 每秒弧度数
Angular加速 rad/sec² 每秒平方的弧度数
区域 mm² 平方毫米
cm² 平方厘米
平方米 平方米(平方)
km² 平方千米
数据量(Volume) mm 2 三维数据集的毫米数
cm-2 厘米立方体
m 进一个 米立方体
km2 千米立方体

 

DirectX 标准注释和语义参考