我正在實作一個自定義數學庫以在 OpenGL 和 DirectX 中創建模型、視圖和投影矩陣。我這樣做是為了提高我對 3D 應用程式背后數學的理解。
起初我看了一下右手和左手坐標系。我意識到,如果我以相同的慣用手創建視圖矩陣和投影矩陣,無論我使用 OpenGL 還是 DirectX(反向平移/旋轉等除外),場景都會正確渲染。這有點令人困惑,因為我閱讀的每篇文章都指出,OpenGL 使用右手坐標系,而 DirectX 使用左手坐標系。我的假設是否正確,坐標系完全取決于視圖和投影矩陣的慣用手?
當我查看剪輯空間時,事情變得更加難以理解。文章指出,兩個 API 中 X 軸和 Y 軸上的剪輯體積范圍從 -1.0 到 1.0。在 Z 軸上,OpenGL 剪輯從 -1.0 到 1.0,DirectX 剪輯從 0.0 到 1.0。但是,在 OpenGL 中,無論我使用投影矩陣在 -1.0 和 1.0 或 0.0 和 1.0 之間進行裁剪,場景都能正確渲染。在 DirectX 中,只有在 0.0 和 1.0 之間進行裁剪的投影矩陣才有效。如果我使用另一個,則不會渲染任何內容。所以我對這個話題的問題是:可以在 Z 軸上更改裁剪量還是那些固定的實作。如果它們是固定的,那么為什么我可以在 OpenGL 中使用兩種型別的裁剪體積,而在 DirectX 中只使用一種?
uj5u.com熱心網友回復:
但是,在 OpenGL 中,無論我使用投影矩陣在 -1.0 和 1.0 或 0.0 和 1.0 之間進行裁剪,場景都能正確渲染。在 DirectX 中,只有在 0.0 和 1.0 之間裁剪的投影矩陣有效
OpenGL 渲染是因為 [0.0, 1.0] 落在 [-1.0, 1.0] 范圍內,但 DirectX 不會因為 [-1.0, 1.0] 可能落在 [0.0, 1.0] 之外。如果您反轉測驗場景的深度,您可能會使用錯誤的投影矩陣在 DirectX 中看到內容。
可以在 Z 軸上更改裁剪量還是那些固定的實作。如果它們是固定的,那么為什么我可以在 OpenGL 中使用兩種型別的裁剪體積,而在 DirectX 中只使用一種?
不,你不能改變這種行為,因為它是規范的一部分。作為渲染管道的一部分,您所做的所有轉換的重點是讓您的場景進入剪切空間。這意味著,例如,將場景的深度從 [-9999, 9999] 映射到 OpenGL 的 [-1.0, 1.0] 或 DirectX 的 [0.0, 1.0]
我的假設是否正確,坐標系完全取決于視圖和投影矩陣的慣用手?
不知道你在這里問什么。您已經觀察到,如果您不考慮慣用手的差異,OpenGL 中的場景在 DirectX 中看起來是倒置的。您的應用程式使用的視圖和投影矩陣不會改變 OpenGL 和 DirectX 實作的行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/417533.html
標籤:
