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 起作用,但它不能正确拉伸。

所需效果的示例图像: 在此处输入图像描述

我也一直在尝试将 *pSourceRect 和 *pDestRect 设置为可以剪切表面但没有任何运气的东西。

我正在使用 DirectX9。

4

1 回答 1

1

我不确定这是否有效(还没有测试过),但理论上你应该用正确的矩形来解决你的问题。选择它们,使其不超过边界并且仅复制重叠部分。我试图将这个想法想象成下图:

重叠矩形

如果我没记错的话应该是

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);

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

于 2013-01-13T21:48:30.437 回答