Что такое эквивалент D3DRS_VIEWPORTENABLE в Xbox360 на WinXP D3D9? - PullRequest
1 голос
/ 03 января 2011

Я поддерживаю многоплатформенную кодовую базу для Xbox360 и WinXP. Я вижу проблему на стороне XP, которая, по-видимому, связана с D3DRS_VIEWPORTENABLE в версии Xbox360, не имеющей аналога для WinXP D3D9. У этой статьи была интересная идея, но единственный способ построить матрицу тождества - предоставить отрицательные числа в D3DVIEWPORT9 :: X и D3DVIEWPORT9 :: Height, но они являются числами без знака. (В любом случае я пытался ввести отрицательные числа, но ничего интересного не произошло.)

Итак, как можно эмулировать поведение D3DRS_VIEWPORTENABLE в WinXP / D3D9?

(Для ясности, результат, который я вижу, состоит в том, что двумерный квадрант с выравниванием экрана отлично работает на Xbox360, но смещается / растягивается на WinXP. Фактически, (0, 0) начинается в центре экрана на WinXP вместо нижнего левого угла, как на Xbox360, в результате применения преобразования окна просмотра.)

Обновление: у меня не было разработчика Xbox360, когда я писал этот вопрос, но с тех пор я его получил. Я прокомментировал отключение состояния D3DRS_VIEWPORTENABLE, и на Xbox360 получилось точно такое же поведение, что и на сборке WinXP. Таким образом, должна быть некоторая магия DirectX, чтобы преодолеть разрыв для эмуляции отключения D3DRS_VIEWPORTENABLE на WinXP.

1 Ответ

2 голосов
/ 13 января 2011

Вместо того, чтобы думать о том, как вы можете поместить негативы в матрицу видового экрана, подумайте об этом из матрицы проекции.

Матрица видового экрана применяется непосредственно после матрицы проекции.Так что, если вы себе представляете установку окна просмотра на тождество и умножение его с помощью матрицы wvp (world-view-projection).то есть

world * view * projection * viewport

Теперь вы можете установить в окне просмотра все, что захотите.

Конечно, на самом деле это также не лучший способ решения проблемы.Некоторые драйверы, вероятно, будут выполнять оптимизацию на основе записей в области просмотра (они могут фактически не делать умножение матрицы, например).Лично я не использовал бы вышеописанную систему, я могу предвидеть слишком много проблем, связанных с ней.

Так что же вас оставит?

Ну, на самом деле все еще довольно просто.Если вы умножите матрицу проекции на матрицу, которая является обратной к матрице окна просмотра, то вы обнаружите, что при применении «матрицы» окна просмотра они взаимно компенсируют друг друга, и у вас остается прямой вывод проекции.Окно просмотра теперь фактически отключено.

...