C++ 将曲面剪裁到视口

C++ 将曲面剪裁到视口,c++,directx,surface,directx-9,clipping,C++,Directx,Surface,Directx 9,Clipping,我试图用一种方法来渲染一个曲面,该方法使用一个曲面和X,Y位置进行渲染。问题是,当曲面在屏幕外一个小像素时,它根本不会渲染 为什么呢?我正在尝试搜索DirectX剪辑,但根本找不到任何内容 void Draw(LPDIRECT3DSURFACE9 src, int x, int y) { D3DSURFACE_DESC desc; src->GetDesc(&desc); D3DVIEWPORT9 viewport; Device->GetV

我试图用一种方法来渲染一个曲面,该方法使用一个曲面和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起作用,但不能正确拉伸

所需效果的示例图像:

我也一直在尝试将*psourcebratten和*pDestRect设置为剪辑曲面但没有任何运气的东西


我使用的是DirectX9。

我不确定这是否有效(尚未测试),但理论上,您应该使用正确的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);

就你而言。目标是矩形不超过相关曲面,因此必须在边缘剪裁矩形的所有坐标。

在代码中使用x和y的位置?在您的示例中,它没有显示。您是否已阅读了
stretcrect
?这里有很多限制,我只是简单地看了看,还没有看到相关的东西,但可能是:)你试过激活调试运行时吗?(请参阅)这会通过OutputDebugString生成良好、清晰的消息,它可能会对这种情况有所说明。(虽然我恐怕没有……我从来没有用过StretchRect。)我试过,但我放弃了。因为如果我在源矩形或目标矩形中设置X和Y坐标,它根本不会渲染,就像我说的。我试图找到一种算法来剪裁曲面大小,使其符合视口的大小,但我找不到任何解决方案。假设屏幕为100,100,X和Y位置为-50,-50,曲面宽度为100,高度为100。它应该只渲染曲面的右下角,但它不渲染?目标矩形是视口的矩形?我尝试了很多组合,但都失败了。是的,这正是我所想的,但当我手动输入时,它无论如何都不起作用。可能是宽度-1和高度-1,因为它从0开始?在示例代码中,使用
vrc.right=viewport.X+viewport.Width不应该是
vrc.right=viewport.Width-1,否则将超出边界。但如果曲面小于视口,则应仅渲染该部分,而不是在视口中完全渲染曲面。因此,如果我有一个500x500的屏幕和一个250x250的曲面,我应该能够在不展开的情况下在中心渲染它,如果我只想显示右下角(视口的左上角)我应该能够提供-250-250坐标。用我最新的尝试将曲面剪裁到视口中更新了我的帖子,但它不起作用。试试我添加的代码,希望它能起作用或至少显示一些有用的东西。