Обтравочная поверхность для просмотра

Я пытаюсь визуализировать поверхность с помощью метода, который принимает позицию 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

Решение

Я не уверен, работает ли это (не проверял это), но теоретически вы должны решить свою проблему с правильными сторонами. Выберите их, чтобы они не выходили за границы и копировалась только перекрывающаяся часть. Я попытался визуализировать мысль в следующую картину:

OverlappingRects

Если я не ошибаюсь, это должно быть

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);

в твоем случае. Цель состоит в том, чтобы прямоугольники не превышали соответствующую поверхность, поэтому все их координаты должны быть обрезаны по краям.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector