繁体   English   中英

将表面剪切到视口

[英]Clipping surface to viewport

我正在尝试使用采用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。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM