1

我正在为 Xbox360 和 WinXP 维护一个多平台代码库。我在 XP 方面看到一个问题,该问题似乎与 Xbox360 版本上的 D3DRS_VIEWPORTENABLE 相关,但在 WinXP D3D9 上没有等效项。本文有一个有趣的想法,但构造单位矩阵的唯一方法是向 D3DVIEWPORT9::X 和 D3DVIEWPORT9::Height 提供负数,但它们是无符号数。(无论如何我都尝试输入负数,但没有发生任何有趣的事情。)

那么,如何在 WinXP/D3D9 下模拟 D3DRS_VIEWPORTENABLE 的行为呢?

(为了清楚起见,我看到的结果是 2d 屏幕对齐四边形在 Xbox360 上工作正常,但在 WinXP 上偏移/拉伸。事实上, (0, 0) 在 WinXP 上从屏幕中心开始,而不是由于应用了视口变换,在左下角,就像在 Xbox360 上一样。)

更新:在我写这个问题的时候,我没有 Xbox360 开发套件,但后来我得到了一个。我注释掉了禁用 D3DRS_VIEWPORTENABLE 状态,并且在 Xbox360 上产生了与在 WinXP 构建上完全相同的行为。因此,必须有一些 DirectX 魔法来弥补这里的差距,以便在 WinXP 上模拟 D3DRS_VIEWPORTENABLE 被关闭。

4

1 回答 1

2

与其考虑如何将底片放入视口矩阵,不如从投影矩阵中考虑。

视口矩阵直接应用在投影矩阵之后。因此,如果您想象将视口设置为标识并将其与 wvp(世界视图投影)矩阵相乘。IE

world * view * projection * viewport

您现在可以将视口设置为您想要的任何内容。

当然,这实际上也不是解决问题的最佳方法。一些驱动程序可能会根据视口中的条目进行优化(例如,它们实际上可能不会进行矩阵乘法)。我个人不会使用上述系统,我可以预见到它会带来太多问题。

那么,这让你何去何从?

那么实际上它仍然很简单。如果将投影矩阵乘以视口矩阵的逆矩阵,那么您会发现,当应用视口“矩阵”时,它们会相互抵消,剩下的就是投影的直接输出。视口现在已被有效地“禁用”。

于 2011-01-13T18:09:07.513 回答