在 OpenGL 和 DirectX 12 中剪辑 Space
Clip Space in OpenGL and DirectX 12
我正在实施自定义数学库以在 OpenGL 和 DirectX 中创建模型、视图和投影矩阵。我这样做是为了提高我对 3D 应用程序背后的数学的理解。
起初我看了一下右手和左手坐标系。我意识到,如果我用相同的惯用手创建视图矩阵和投影矩阵,那么无论我使用 OpenGL 还是 DirectX(倒置 translation/rotation/etc 除外),场景都会正确渲染。这有点令人困惑,因为我阅读的每篇文章都指出,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 中只能使用一种?
However, in OpenGL the scene renders correctly no matter if I use a projection matrix for clipping between -1.0 and 1.0 or 0.0 and 1.0. In DirectX only the projection matrix for clipping between 0.0 and 1.0 works
OpenGL 渲染是因为 [0.0, 1.0] 在 [-1.0, 1.0] 范围内,但 DirectX 不渲染,因为 [-1.0, 1.0] 可以在 [0.0, 1.0] 之外。如果反转测试场景的深度,您可能会使用错误的投影矩阵在 DirectX 中看到东西。
Can the clipping volume be changed on the Z axis or are those fixed implementations. If they are fixed, then why can I use both types of clipping volumes in OpenGL and only a single one in DirectX?
不,您不能更改该行为,因为它是规范的一部分。作为渲染管道的一部分,您所做的所有转换的要点是让您的场景进入裁剪 space。这意味着,例如,将场景深度从 [-9999, 9999] 映射到 [-1.0, 1.0](对于 OpenGL)或 [0.0, 1.0](对于 DirectX
)
Is my assumption right, that the coordinate system completely depends on the handedness of the view and projection matrices?
不确定你在这里问什么。您已经观察到,如果不考虑用手习惯的差异,OpenGL 中的场景在 DirectX 中看起来是倒置的。您的应用程序使用的视图和投影矩阵不会改变 OpenGL 和 DirectX 实现的行为。
我正在实施自定义数学库以在 OpenGL 和 DirectX 中创建模型、视图和投影矩阵。我这样做是为了提高我对 3D 应用程序背后的数学的理解。
起初我看了一下右手和左手坐标系。我意识到,如果我用相同的惯用手创建视图矩阵和投影矩阵,那么无论我使用 OpenGL 还是 DirectX(倒置 translation/rotation/etc 除外),场景都会正确渲染。这有点令人困惑,因为我阅读的每篇文章都指出,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 中只能使用一种?
However, in OpenGL the scene renders correctly no matter if I use a projection matrix for clipping between -1.0 and 1.0 or 0.0 and 1.0. In DirectX only the projection matrix for clipping between 0.0 and 1.0 works
OpenGL 渲染是因为 [0.0, 1.0] 在 [-1.0, 1.0] 范围内,但 DirectX 不渲染,因为 [-1.0, 1.0] 可以在 [0.0, 1.0] 之外。如果反转测试场景的深度,您可能会使用错误的投影矩阵在 DirectX 中看到东西。
Can the clipping volume be changed on the Z axis or are those fixed implementations. If they are fixed, then why can I use both types of clipping volumes in OpenGL and only a single one in DirectX?
不,您不能更改该行为,因为它是规范的一部分。作为渲染管道的一部分,您所做的所有转换的要点是让您的场景进入裁剪 space。这意味着,例如,将场景深度从 [-9999, 9999] 映射到 [-1.0, 1.0](对于 OpenGL)或 [0.0, 1.0](对于 DirectX
)Is my assumption right, that the coordinate system completely depends on the handedness of the view and projection matrices?
不确定你在这里问什么。您已经观察到,如果不考虑用手习惯的差异,OpenGL 中的场景在 DirectX 中看起来是倒置的。您的应用程序使用的视图和投影矩阵不会改变 OpenGL 和 DirectX 实现的行为。