0

サーフェスと X、Y 位置をレンダリングするメソッドを使用してサーフェスをレンダリングしようとしています。問題は、サーフェスが 1 つの小さなピクセルだけ画面の外にある場合、まったくレンダリングされないことです。

何故ですか?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を使用しています。

4

1 に答える 1

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

あなたの場合。目標は、長方形が関連するサーフェスを超えないようにすることです。そのため、長方形のすべての座標をエッジでクリップする必要があります。

于 2013-01-13T21:48:30.437 に答える