我正在维护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。
答案 0 :(得分:2)
而不是考虑如何将负片放入视口矩阵中,而不是从投影矩阵中考虑它。
视口矩阵直接应用于投影矩阵之后。因此,如果您想象将视口设置为identity并将其与wvp(world-view-projection)矩阵相乘。即
world * view * projection * viewport
您现在可以将视口设置为您想要的任何内容。
当然,这实际上并不是解决问题的最佳方法。一些驱动程序可能会根据视口中的条目进行优化(实际上它们可能不会进行矩阵乘法)。我不会亲自使用上述系统,我可以预见会有太多问题。
那么你离开了哪里?
实际上它仍然非常简单。如果将投影矩阵乘以与视口矩阵相反的矩阵,那么您会发现当应用视口“矩阵”时,它们相互抵消,并且您将保留投影的直接输出。视口现在已被“禁用”。