剪切表面到视口

时间:2013-01-12 20:07:36

标签: c++ directx surface directx-9 clipping

我正在尝试使用一个方法渲染一个曲面,该方法采用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。

1 个答案:

答案 0 :(得分: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);

在你的情况下。目标是矩形不超过相关表面,因此它们的所有坐标都必须在边缘处剪裁。