我正在为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开发工具包,但后来我得到了一个。我注释掉了D3DRS_VIEWPORTENABLE状态的禁用,在Xbox360上产生了与在WinXP构建上完全相同的行为。因此,必须有一些DirectX魔术来弥补在WinXP上模拟D3DRS_VIEWPORTENABLE被关闭的差距。
发布于 2011-01-14 02:09:08
与其考虑如何将底片放入视窗矩阵中,不如从投影矩阵中考虑它。
在投影矩阵之后直接应用视口矩阵。因此,如果您设想将视区设置为identity,并将其与wvp (world-view-projection)矩阵相乘。即
world * view * projection * viewport现在可以将视口设置为所需的任何值。
当然,这实际上也不是解决问题的最好方法。一些驱动程序可能会根据视口中的条目进行优化(例如,它们实际上可能不会进行矩阵相乘)。我个人不会使用上面的系统,因为我可以预见它会带来太多的问题。
那么,这会把你带到哪里?
实际上,它仍然很简单。如果您将投影矩阵乘以与视口矩阵相反的矩阵,那么您会发现,当应用视口“矩阵”时,它们相互抵消,您将得到投影的直接输出。现在,视口已被有效地“禁用”。
https://stackoverflow.com/questions/4583380
复制相似问题