2014-12-05 2 views
0

다중 뷰에서 여러 이미지를 하나의 텍스처로 혼합하기 위해 Direct3D 11을 사용하고 싶습니다. 그래서 SVexition에 저장된 투영 결과 중 하나 인 Vertex Shader 스테이지와 Geometry Shader 스테이지에서 여러 투영을하고 POSITION0, POSITION1에 다른 투영 이미지를 저장합니다 등등. 이 위치는 이미지를 샘플링하는 데 사용됩니다.래스터 라이저 단계에서 어떤 현상이 발생 했습니까?

Pixel 쉐이더 단계에서 SV_Position의 값은 화면 공간에 있기 때문에 (307.5,87.5)와 비슷합니다. 렌더링 대상 크기가 500x500이므로 샘플의 uv가 (0.615,0.0.175)이므로 맞습니다. POSITION0의 값은 (0.1312, 0.370)과 같을 것이고, 오프셋을 사용하여 수직 반전됩니다. 나는해야만한다 (0.5 + x, 0.5 - y). 투사는 비틀어지고 대략 일치합니다.

SV_Position에서 래스터 라이저 단계는 무엇을합니까?

답변

1

래스터 라이저 단계에서 SV_Position의 좌표는 정규화 된 장치 좌표입니다. 이 공간에서 -1.0+1.0 사이의 X 및 Y 값은 전체 출력 대상을 포함하며 Y는 "위로"이동합니다. 그렇게하면 셰이더의 정확한 출력 해상도에 신경 쓸 필요가 없습니다.

여러분이 알다시피, 픽셀이 대상에 쓰여지기 전에 또 다른 변환이 수행됩니다. 하나는 Y 축을 반전하고 X와 Y는 축척하고 원점은 맨 위 왼쪽 모서리로 이동합니다.

Direct3D11에서이 변환을위한 매개 변수는 ID3D11DeviceContext::RSSetViewports 메서드를 통해 제어 할 수 있습니다.

픽셀 쉐이더에서 픽셀 좌표가 필요하면 변환을 직접해야합니다. 셰이더에서 출력 해상도에 액세스하려면 셰이더 상수로 바인딩하십시오.

+0

그러면 투영 이후의 좌표가 NDC로 변환 되었습니까? 어떤 관점 변환은'(0.5 + x, 0.5 - y)'와 같아서 – Clones1201

+0

의 투영 위치를 w로 나눈 다음 NDC가되어 작동합니다. – Clones1201

+0

예, 죄송합니다. 나는'SV_Position'이 perspective 분할 전에'[-1, 1]'범위 밖에있을 수 있음을 언급하는 것을 잊었습니다. – Lucius

관련 문제