在WinXP D3D9上,Xbox360的D3DRS_VIEWPORTENABLE等价物是什么?

时间:2011-01-03 09:33:01

标签: graphics windows-xp xbox360 direct3d9

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

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

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

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

1 个答案:

答案 0 :(得分:2)

而不是考虑如何将负片放入视口矩阵中,而不是从投影矩阵中考虑它。

视口矩阵直接应用于投影矩阵之后。因此,如果您想象将视口设置为identity并将其与wvp(world-view-projection)矩阵相乘。即

world * view * projection * viewport

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

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

那么你离开了哪里?

实际上它仍然非常简单。如果将投影矩阵乘以与视口矩阵相反的矩阵,那么您会发现当应用视口“矩阵”时,它们相互抵消,并且您将保留投影的直接输出。视口现在已被“禁用”。