Отразить текстуру Directx10 по горизонтали/вертикали

Как я упоминал в заголовке, знаете ли вы, как перевернуть объект 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); линия не отражает мою текстуру. Какие-либо предложения ?


person mcelik    schedule 04.09.2013    source источник


Ответы (1)


В вашем шейдере выполните 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 должны быть зеркально отражены, а не завернуты.

Так что это учитывается только для пикселей по краю, когда вы фильтруете изображение.

person Goz    schedule 05.09.2013
comment
Спасибо за ответ, но я не использую шейдер для этой программы. - person mcelik; 05.09.2013