轉換和轉換
在主應用程式與效果參數之間傳輸值時,當主應用程式中的源資料類型 () 符合效果參數) 中的目的地資料類型 (時,資料會如預期般寫入。 當資料類型不同時,當來源資料重新排列以符合目的地時,就會發生轉換。
DXSAS 會定義下列類型轉換規則。 這些是效果的超集合 (.fx) 和 HLSL 類型轉換規則。 DXSAS 也會定義一些 參數值修飾 詞,這些修飾詞可能會影響從主應用程式傳送至系結參數的值。
型別轉換
下表列出將某個資料類型傳送到另一個資料類型時所發生的轉換:
來源類型 | 目的地類型 | 行為 |
---|---|---|
FLOAT | int | 以趨近於零的方式捨入。 |
float、int | bool | 值不等於 0 - 根據與 0 的比較,與 0 (int) 或 0.0 (float) - 視為 true,否則值會被視為 false。 |
int | FLOAT | |
bool | int、float | False 會轉換成零。True 會轉換成一個。 |
texture1D, texture2D, texture3D, textureCUBE | 紋理 | 目的地紋理會被視為來源紋理類型。 |
string | texture1D, texture2D, texture3D, textureCUBE | 字串值會被視為資源位址,並以與 參數初始化注釋相同的方式解析。 如果無法解析資源位址,轉換無效,而且主應用程式必須傳回錯誤。 如果資源已正確解析,運算式的類型會被視為與已解析的資源相同類型。 |
類別轉換
除了上述類型轉換規則之外,DXSAS 還會定義在類別類型之間轉換所需的一組轉換規則。 資料行矩陣 (N x 1) 、資料列矩陣 (1 x N) ,而數值結構則會視為向量。
效果矩陣參數和 HLSL 矩陣變數可以定義值是否為數據列主要或資料行主要矩陣;不過,DirectX API 一律會將 D3DMATRIX 和 D3DXMATRIX 視為資料列主要。
來源類別 | 目的地類別 | 行為 |
---|---|---|
純量 | 純量 | 套用類型轉換。 |
純量 | 向量 | 套用類型轉換中所述的類型轉換和轉換行為之後,將純量來源值複寫至目的地向量的每個元件。 |
純量 | 矩陣 | 套用類型轉換中所述的類型轉換和轉換行為之後,將純量來源值複寫至目的地矩陣的每個元件。 |
純量 | Object | 轉換無效。 主應用程式必須傳回錯誤。 |
純量 | 結構 | 只有在目的地結構只包含數值元素時才有效。 如果有效,請在套用類型轉換中所述的類型轉換和轉換行為之後,將純量來源值複寫至目的地結構的每個元件。 |
向量 | 純量 | 目的地純量會在套用 類型轉換中所述的類型轉換和轉換行為之後,接收來源向量第一個元件的值。 |
向量 | 向量 | 如果目的地向量具有比來源向量更多的元件,則轉換無效。 目的地向量會在套用 類型轉換中所述的類型轉換和轉換行為之後,接收來源向量的最左邊值。 來源向量的其餘最右邊元件會遺失。 |
向量 | 矩陣 | 除非來源向量具有與目的地矩陣相同的元件數目,否則轉換無效。 如果轉換有效,則會套用向量對向量轉換的行為。 |
向量 | Object | 轉換無效。 主應用程式必須傳回錯誤。 |
向量 | 結構 | 只有當目的地結構只有數值元素且不包含比來源向量具有元件更多的專案時,才有效。 目的地結構的元素會在套用 類型轉換中所述的類型轉換和轉換行為之後,接收來源向量的最左邊元件。 |
矩陣 | 純量 | 在套用類型轉換中所述的類型轉換和轉換行為之後,目的地純量會接收來源矩陣左上角最上層值的值。 |
矩陣 | 向量 | 除非來源矩陣的元件數目與目的地向量相同,否則轉換無效。 如果轉換有效,則會套用上述向量對向量轉換的行為。 |
矩陣 | 矩陣 | 如果目的地矩陣的元件超過來源矩陣,則轉換無效。 目的地矩陣會在套用 類型轉換中所述的類型轉換和轉換行為之後,接收來源矩陣的左上角最大值。 來源矩陣的其餘最右下層元件會遺失。 |
矩陣 | Object | 轉換無效。 主應用程式必須傳回錯誤。 |
矩陣 | 結構 | 結構的大小必須等於矩陣的大小,而且結構的所有元件都必須是數值。 |
Object | 純量 | 轉換無效。 主應用程式必須傳回錯誤。 |
Object | 向量 | 轉換無效。 主應用程式必須傳回錯誤。 |
Object | 矩陣 | 轉換無效。 主應用程式必須傳回錯誤。 |
Object | Object | 如果物件的型別相同,且根據 類型轉換中定義的行為,則有效。 |
結構 | 純量 | 如果來源結構至少包含一個數值成員,則為有效。 目的地純量會在套用 類型轉換中所述的類型轉換和轉換行為之後,接收來源結構第一個數值成員的值。 |
結構 | 向量 | 來源結構至少必須是向量的大小。 第一個元件必須數值上限為目的地向量的大小。 |
結構 | 矩陣 | 來源結構至少必須是向量的大小。 第一個元件必須數值上限為目的地向量的大小。 |
結構 | 結構 | 目的地結構不得大於來源結構。 有效的轉換必須存在於所有個別來源和目的地元件之間。 |
參數值修飾詞
參數修飾詞注釋會將其他資訊新增至參數,以便正確解譯參數的資料。 例如,向量可能需要以標準化資料表示,或長度可能以英吋為單位來測量。 參數值修飾詞注釋表示這項額外資訊,讓主應用程式可以在資料傳送至效果參數時正確轉換值。
以下是參數修飾詞:
參數值修飾詞注釋 | 描述 |
---|---|
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/sec | 每秒公釐 |
cm/sec | 每秒公分 | |
m/sec | 每秒計量數 | |
m/hr | 每小時計量 | |
km/hr | 每小時的公里數 | |
線性加速 | mm/sec≦ | 每秒平方公釐 |
cm/sec≦ | 每秒公分平方 | |
m/sec≦ | 每秒平方公尺 | |
m/hr≦ | 每小時平方公尺 | |
km/hr≦ | 每小時平方的公里數 | |
Angular速度 | rad/sec | 每秒弧度數 |
Angular加速 | rad/sec | 每秒平方的弧度數 |
區域 | mm¹ | 公釐平方 |
cm¹ | 公分平方 | |
平方米 | 公尺平方 | |
km不等 | 平方公尺 | |
磁碟區 | mm≦ | 公釐立方體 |
cm≦ | 公分 Cubed | |
m≦ | 計量 Cubed | |
kmMl | Cubed 的公里數 |
相關主題