2013-01-12 7 views
0

렌더링 할 Surface와 X, Y 위치를 취하는 메서드로 서페이스를 렌더링하려고합니다. 문제는 표면이 하나의 작은 픽셀로 스크린 외부에있을 때 전혀 렌더링되지 않는다는 것입니다.뷰포트에 서페이스 클리핑

왜 그럴까요? DirectX 클리핑을 검색하려고하지만 아무 것도 찾을 수 없습니다.

void Draw(LPDIRECT3DSURFACE9 src, int x, int y) 
{ 
    D3DSURFACE_DESC desc; 
    src->GetDesc(&desc); 

    D3DVIEWPORT9 viewport; 
    Device->GetViewport(&viewport); 

    int vX = viewport.X; 
    int vY = viewport.Y; 
    int vWidth = viewport.X + viewport.Width; 
    int vHeight = viewport.Y + viewport.Height; 

    RECT source; 
    source.left = max(x, vX); 
    source.right = min(source.left + desc.Width, vWidth); 
    source.top = max(y, vY); 
    source.bottom = min(source.top + desc.Height, vHeight); 

    RECT destination; 
    destination.left = max(x, vX); 
    destination.right = min(destination.left + desc.Width + x, vWidth); 
    destination.top = max(y, vY); 
    destination.bottom = min(destination.top + desc.Height + y, vHeight); 

    Device->StretchRect(src, &source, BackBuffer, &destination, D3DTEXF_POINT); 
}; 

... 및 X = 100, Y = 100은 작동하지 않지만 -100은 작동하지만 올바르게 늘리지는 않습니다. 원하는 효과의

예 이미지 : enter image description here

나는 또한 클립 표면하지만 운이없이 무언가에 *의 pSourceRect와 * pDestRect을 설정하기 위해 노력했습니다.

저는 DirectX9를 사용하고 있습니다.

+0

코드에서 x와 y는 어디에 사용합니까? 귀하의 예에서는 보여주지 않습니다. StrectRect의 [documentation] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb174471%28v=vs.85%29.aspx)를 읽으셨습니까? 많은 제한이 있습니다, havent에서 간단한 것을 보았습니다. 뭔가 관련되어 보였습니다. 아마도 어쩌면 거기에 :) – Gnietschow

+0

디버그 런타임 활성화를 시도 했습니까? (http://legalizeadulthood.wordpress.com/2009/06/28/direct3d-programming-tip-5-use-the-debug-runtime/ 참조) OutputDebugString을 통해 양호하고 명확한 메시지가 생성되며, 이 사건에 관해서. (비록 내가 두려워하지만 ... 나는 StretchRect를 사용한 적이 없다.) –

+0

나는 해봤지만 포기했다. 왜냐하면 내가 말한 것처럼 소스 또는 대상 사각형에서 X 및 Y 좌표를 설정하면 전혀 렌더링되지 않기 때문입니다. 표면 크기를 클리핑하여 뷰포트 크기에 맞는 알고리즘을 찾으려고하지만 모든 솔루션을 찾을 수 없습니다. – Deukalion

답변

1

이 방법이 작동하는지 (이론적으로는 테스트하지 않았 음) 확실하지 않지만 이론적으로는 오른쪽 rect를 사용하여 문제를 해결해야합니다. 테두리를 초과하지 않고 겹치는 부분 만 복사되도록 선택하십시오. 나는 다음과 같은 그림으로 생각을 시각화하려고 : 내가 잘못 아니에요 경우가 귀하의 경우

RECT source; 
source.left = max(min(-x, desc.Width - 1),0); 
source.right = max(min(source.left + viewport.Width -1, desc.Width - 1),0); 
source.top = max(min(-y, desc.Height - 1),0); 
source.bottom = max(min(source.top + viewport.Height -1, desc.Width - 1),0); 

RECT destination; 
destination.left = max(min(x, viewport.Width - 1),0); 
destination.right = max(min(destination.left + desc.Width -1, viewport.Width - 1),0); 
destination.top = max(min(y, viewport.Height - 1),0); 
destination.bottom = max(min(destination.top + desc.Height -1, viewport.Height - 1),0); 

을해야

OverlappingRects

. 목표는 직사각형이 관련 표면을 초과하지 않기 때문에 모든 좌표가 모서리에서 잘려야합니다.

+0

예, 정확히 생각했지만 입력 할 때입니다. 수동으로 정확하게 작동하지 않습니다. – Deukalion

+0

width-1과 height-1이 0부터 시작하기 때문에 가능합니까? 그리고 귀하의 예제 코드에서'vrc.right = viewport.X + viewport.Width;'를 사용하면 안됩니다'vrc.right = viewport.Width-1;', 그렇지 않으면 경계를 초과합니다. – Gnietschow

+0

그러나 서페이스가 뷰포트보다 작 으면 해당 파트를 렌더링하고 뷰포트에서 서페이스를 완전히 렌더링하지 않아야합니다. 따라서 500x500 크기의 화면과 250x250의 화면이있는 경우 확대하지 않고 중앙에서 렌더링 할 수 있어야하며, 바로 밑 구석 (뷰포트의 topleft 모서리)을 표시하려는 경우 제공 할 수 있어야합니다. 250-250 좌표. – Deukalion