我正在尝试使用一个方法渲染一个曲面,该方法采用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。
答案 0 :(得分: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);
在你的情况下。目标是矩形不超过相关表面,因此它们的所有坐标都必须在边缘处剪裁。