2011-01-03 3 views
1

Xbox360 및 WinXP 용 멀티 플랫폼 코드베이스를 유지 관리하고 있습니다. WinXP D3D9에 상응하는 기능이없는 Xbox360 버전의 D3DRS_VIEWPORTENABLE과 관련된 것으로 보이는 XP 측의 문제가 나타납니다. This article에는 흥미로운 아이디어가 있지만 단위 행렬을 구성하는 유일한 방법은 D3DVIEWPORT9 :: X 및 D3DVIEWPORT9 :: Height에 음수를 제공하는 것이지만 부호없는 숫자입니다. (어쨌든 음수를 넣으려고했지만 아무런 문제가 발생하지 않았습니다.)WinXP D3D9에서 Xbox360의 D3DRS_VIEWPORTENABLE은 무엇입니까?

그렇다면 WinXP/D3D9에서 D3DRS_VIEWPORTENABLE의 동작을 어떻게 에뮬레이트합니까?

(분명히하기 위해, 2 차원 화면 정렬 쿼드는 Xbox360에서 잘 작동하지만 WinXP에서 오프셋/늘입니다. 사실 (0, 0)은 화면 중앙에서 시작됩니다 뷰포트 변환을 적용한 결과 Xbox360에서와 같이 왼쪽 하단 모서리가 아닌 WinXP에 있음)

업데이트 :이 질문을 쓴 당시 Xbox360 devkit을 가지고 있지 않았지만, 한 번 샀다. D3DRS_VIEWPORTENABLE 상태를 사용할 수 없도록 설정했으며 WinXP 빌드에서와 동일한 방식으로 Xbox360에서 동일한 동작을 수행했습니다. 따라서 WinXP에서 D3DRS_VIEWPORTENABLE을 에뮬레이션하기위한 틈새를 막기위한 DirectX 마법이 있어야합니다.

답변

2

네거티브를 뷰포트 매트릭스에 넣을 수있는 방법을 생각하는 대신 프로젝션 매트릭스에서 네거티브를 생각할 수 있습니다.

뷰포트 매트릭스는 투영 매트릭스 바로 뒤에 적용됩니다. 따라서 뷰포트를 ID로 설정하고 wvp (월드 뷰 - 영사) 행렬을 곱하면됩니다. ie

world * view * projection * viewport 

이제 원하는대로 뷰포트를 설정할 수 있습니다.

물론 이것은 실제로 문제를 공격하는 가장 좋은 방법은 아닙니다. 일부 드라이버는 뷰포트의 항목을 기반으로 최적화를 수행합니다 (실제로 행렬 곱셈을 수행하지 않을 수도 있음). 위의 시스템을 개인적으로 사용하지는 않을 것이므로 너무 많은 문제가 발생할 수 있습니다.

그렇다면 어디에서 떠나나요?

글쎄 실제로는 아직 꽤 간단합니다. 투영 행렬에 뷰포트 행렬의 역함을 곱한 행렬을 곱하면 뷰포트 "행렬"이 적용될 때 서로 상쇄되고 투영의 직접 출력이 남음을 알 수 있습니다. 이제 뷰포트가 효과적으로 "비활성화"되었습니다.

+0

제 경우에는 버텍스 쉐이더가 전체 행렬 "체인"을 사용하지 않고 있지만 실제로 버텍스 쉐이더의 실제 계산에 적용된 아이디어가 효과가있었습니다. (즉, 불가피 뷰포트 행렬과 결합되었을 때 뷰포트 행렬 계산을 뒤집어 효과적으로 식별 행렬 이었음) –

+0

@Jim : 현상금 도움이 되었으면 좋겠다 :) 현상금의 기회? ;) – Goz

+0

아, 아, 나는 자동적으로 대답을 수락했다고 생각했는데, 미안해. 이제 현상금 아이콘을 클릭했습니다. 아이콘이 여전히 있고 클릭 할 수있는 상태이므로 통과 여부는 확실하지 않습니다. 완료되지 않은 경우 다른 설명을 추가하십시오. (이것은 나의 첫 현상금에 기초한 질문입니다.) –