1

タイトルで述べたように、ID3D10Texture2D オブジェクトを水平/垂直に反転する方法を知っていますか?

このコードを使用してスクリーンショットを撮り、ファイルに保存しました。

ID3D10Resource *backbufferRes;
renderTargetView->GetResource(&backbufferRes);
ID3D10Texture2D *mRenderedTexture;

// Create our texture
D3D10_TEXTURE2D_DESC texDesc;
texDesc.ArraySize = 1;
texDesc.BindFlags = 0;
texDesc.CPUAccessFlags = 0;
texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
texDesc.Width = 640;  // must be same as backbuffer
texDesc.Height = 480; // must be same as backbuffer
texDesc.MipLevels = 1;
texDesc.MiscFlags = 0;
texDesc.SampleDesc.Count = 1;
texDesc.SampleDesc.Quality = 0;
texDesc.Usage = D3D10_USAGE_DEFAULT;

d3d10Device->CreateTexture2D(&texDesc, 0, &mRenderedTexture); 

d3d10Device->CopyResource(mRenderedTexture, backbufferRes);

D3DX10FilterTexture(mRenderedTexture, 0, D3DX10_FILTER_MIRROR_U);

D3DX10SaveTextureToFile(mRenderedTexture, D3DX10_IFF_PNG, L"test.png");

D3DX10FilterTexture(mRenderedTexture, 0, D3DX10_FILTER_MIRROR_U); ラインは私のテクスチャを反映しません。助言がありますか ?

4

1 に答える 1

0

シェーダーで 1-u を実行して水平方向に反転するか、1-v を実行して垂直方向に反転します。

編集:実際にレンダリングを行っていない場合は、画像操作を行うためのはるかに優れた方法があります。ただし、手動で行う場合は、マップを使用して自分でデータを反転する必要があります。

次のように実行できます (コードはテストされていないため、コンパイル エラーが発生した場合はご容赦ください)。

D3D10Resource *backbufferRes;
renderTargetView->GetResource(&backbufferRes);
ID3D10Texture2D *mRenderedTexture;

// Create our texture
D3D10_TEXTURE2D_DESC texDesc;
texDesc.ArraySize = 1;
texDesc.BindFlags = 0;
texDesc.CPUAccessFlags = 0;
texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
texDesc.Width = 640;  // must be same as backbuffer
texDesc.Height = 480; // must be same as backbuffer
texDesc.MipLevels = 1;
texDesc.MiscFlags = 0;
texDesc.SampleDesc.Count = 1;
texDesc.SampleDesc.Quality = 0;
texDesc.Usage = D3D10_USAGE_DEFAULT;

d3d10Device->CreateTexture2D(&texDesc, 0, &mRenderedTexture); 

d3d10Device->CopyResource(mRenderedTexture, backbufferRes);

D3D10_MAPPED_TEXTURE2D d3d10MT = { 0 };
mRenderedTexture->Map( 0, D3D10_MAP_READ_WRITE, 0, &d3d10MT );

unsigned int* pPix = (unsigned int)d3d10MT.pData;

int rows    = 0;
int rowsMax = height;
while( rows < rowsMax )
{
    unsigned int* pRowStart = pPix + (rows * width);
    unsigned int* pRowEnd   = pRowStart + width;
    std::reverse( pRowStart, pRowEnd );
    rows++;
}

mRenderedTexture->Unmap();

D3DX10SaveTextureToFile(mRenderedTexture, D3DX10_IFF_PNG, L"test.png");

ドキュメントから:

D3DX10_FILTER_MIRROR_U U 軸上のテクスチャのエッジから離れたピクセルは、ラップではなくミラーリングする必要があります。

そのため、画像をフィルタリングしているときに、エッジを丸めたピクセルのみがカウントされます。

于 2013-09-05T08:25:45.930 に答える