Я пытаюсь визуализировать поверхность с помощью метода, который принимает позицию 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 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);
в твоем случае. Цель состоит в том, чтобы прямоугольники не превышали соответствующую поверхность, поэтому все их координаты должны быть обрезаны по краям.
Других решений пока нет …