我正在尋找glm的源代碼實現,我想知道他們爲什麼用聯合代表矢量值,而不是像float
或int
這樣的基本數據類型?爲什麼glm :: vec將vec值表示爲工會?
這是我在vec4
實施來找到代碼:
union { T x, r, s; };
union { T y, g, t; };
union { T z, b, p; };
union { T w, a, q; };
的區別是什麼,如果我們只是寫T x
,T y
,T z
,T w
?
我正在尋找glm的源代碼實現,我想知道他們爲什麼用聯合代表矢量值,而不是像float
或int
這樣的基本數據類型?爲什麼glm :: vec將vec值表示爲工會?
這是我在vec4
實施來找到代碼:
union { T x, r, s; };
union { T y, g, t; };
union { T z, b, p; };
union { T w, a, q; };
的區別是什麼,如果我們只是寫T x
,T y
,T z
,T w
?
因爲vec4
常用於:
x
,y
,z
,w
r
,g
,b
,a
s
,t
,p
, q
(雖然這些都不太標準化,我有一個LSO看出r
和在不同的上下文中使用u
)使用工會允許使用以訪問例如第二個數據成員爲.y
或.g
,具體取決於您的偏好&語義。
這是用法定義的行爲嗎?我知道與工會打字不是,但這不是真的打字。 – chbaker0
@ chbaker0如果你只爲給定的成員使用一個名字,毫無疑問。如果你使用多個...我仍然這麼認爲。我更熟悉C語言,C語言專門針對工會。 C++似乎沒有,但我認爲「對象生命週期」(N4140 3.8.7)下的某些內容具有使其合法的效果,因爲不同的名稱是具有相同類型和相同存儲位置的不同「對象」 ,並且在使用一個和使用另一個(在一個技術上導致一個結束而另一個開始)的存儲器之間沒有釋放存儲器。 – hobbs
@ chbaker0:是的,這是明確定義的行爲,因爲所有類型都是相同的。是的,即使在C++中也是如此。 –
GLM的設計行爲就像GLSL一樣,C++允許。在GLSL中,矢量的調劑操作可以使用xyzw
,rgba
或stpq
,其中相應的元素名稱引用矢量的相同元素。因此,聯合會用於匹配此行爲。
加號之一用於突出顯示兼容性對於GLSL,我沒有考慮過這一點。 – Angew
這是真正的原因。 GLM的行爲不像本機設計的C++類。 –
只是說明:這使得'v.x == v.r == v.s' – pingul