2013-01-12 25 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)?有很多限制,从我的简短看看还没有看到相关的东西,但也许它有:) – Gnietschow

+0

您是否尝试过激活调试运行时? (请参阅http://legalizeadulthood.wordpress.com/2009/06/28/direct3d-programming-tip-5-use-the-debug-runtime/)通过OutputDebugString可以产生良好,清晰的消息,说这个案子。 (虽然我害怕我不......我从来没有使用StretchRect。) –

+0

我试过了,但我放弃了。因为如果我将X和Y坐标设置在源矩形或目标矩形中,它就根本不渲染,就像我说的。我试图找到一个算法来裁剪表面大小,以适应视口的大小,但我找不到任何解决方案。 – Deukalion

回答

1

我不确定,这是否有效(还没有测试过),但理论上你应该用正确的方法解决你的问题。选择它们,以便它不超过边框,并且只复制重叠部分。我试图想到可视化到下面的图片:

OverlappingRects

如果我没有记错的话应该是

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); 
你的情况

。目标是矩形不会超过相关表面,所以它们的所有坐标都必须在边缘处裁剪。

+0

是的,这与我的想法完全相同,但是当我输入它时手动完全无法工作。 – Deukalion

+0

也许宽度-1和高度-1,因为它从0开始?在你的示例代码中,你使用'vrc.right = viewport.X + viewport.Width;'不应该是'vrc.right = viewport.Width-1;',否则它会超出边界。 – Gnietschow

+0

但是,如果曲面小于视口,它应该只渲染该部分,并且不能在视口中完全渲染曲面。所以如果我有一个500x500的屏幕和一个250x250的表面,我应该可以在不扩展的情况下在中心渲染它,如果我想只显示右下角(视口的整个角落),我应该能够提供 - 250-250坐标。 – Deukalion