[英]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.