使用Directx 11 c++提高将纹理保存到文件的速度



我有一个基于DirectX11的渲染,我需要将大量渲染的图像保存到硬盘上。我使用了SaveWICTextureToFile,但保存每个图像需要0.2秒。图像以1024x768的分辨率保存。

这里是保存图像的代码:

ComPtr<ID3D11Texture2D> backBuffer;
HRESULT hr = _swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<LPVOID*>(backBuffer.GetAddressOf()));
throwIfFail(hr, "Unable to get a buffer");
#ifdef LOG
auto end = high_resolution_clock::now();
wchar_t str[256];
auto tmp = end;
#endif
hr = SaveWICTextureToFile(_context.Get(), backBuffer.Get(), GUID_ContainerFormatJpeg, w.c_str()/*,&GUID_WICPixelFormat32bppBGRA*/);
//hr = SaveDDSTextureToFile(_context.Get(), backBuffer.Get(), w.c_str()/*,&GUID_WICPixelFormat32bppBGRA*/);
#ifdef LOG
end = high_resolution_clock::now();
wsprintf(str, L"DXRender::saveLastRenderToFile: %d n", duration_cast<microseconds>(end - tmp).count());
OutputDebugString(str);
tmp = end;
#endif
throwIfFail(hr, "Unable to save buffer");

如何减少保存每张图像所需的时间?

我已经测试了libJPEG和libPNG库来保存图像,它比SaveWICToTextureFile工作得又好又快,这里唯一的技巧是需要考虑DirectX纹理的格式。。示例:纹理格式:B8G8R8A8然后访问每种颜色需要获得第n个8位才能获得每个通道。。这是这里唯一的窍门。。

示例:

auto lastText = _textureDesc;
_inputTexture->GetDesc(&_textureDesc);
unsigned char r, g, b;
int _textureRowSize = _mappedResource.RowPitch / sizeof(unsigned char);
int hIdx = 0;
for (int i = 0; i < _textureDesc.Height; ++i)
{
int wIdx = 0;
for (int j = 0; j < _textureDesc.Width; ++j)
{
r = (unsigned char)textPtr[hIdx + wIdx + 2];
g = (unsigned char)textPtr[hIdx + wIdx + 1];
b = (unsigned char)textPtr[hIdx + wIdx];

//do whatever you want with this values...

wIdx += 4;
}
hIdx += _textureRowSize;
}

最新更新