2013-09-04 3 views
1

Как я упоминал в названии, вы знаете, как перевернуть объект ID3D10Texture2D горизонтально/вертикально?Directx10 флип текстуры горизонтальный/вертикальный

Я использовал этот код, чтобы сделать снимок экрана и сохранить его в файле.

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

ответ

0

В вашем шейдере сделайте 1-u, чтобы перевернуть горизонтально или 1-v, чтобы перевернуть по вертикали.

Edit: Если вы на самом деле не делать какие-либо рендеринга, то есть гораздо лучшие способы сделать манипуляции с изображениями. Однако, если вы хотите сделать это вручную, вам придется использовать карту и перевернуть данные вокруг себя.

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

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

Из док BTW:

D3DX10_FILTER_MIRROR_U пикселы от края текстура на оси должна быть зеркальной, а не завернутой.

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

+0

Спасибо за ответ, но я не использую шейдер для этой программы. – mcelik

+0

@mcelik: обновлено – Goz

Смежные вопросы