【问题标题】:DirectX. How to convert a texture from one pixel format to another (RGBA -> BGRA)?DirectX。如何将纹理从一种像素格式转换为另一种(RGBA -> BGRA)?
【发布时间】:2017-09-22 10:13:18
【问题描述】:

下午好!

我是 DirectX 初学者,很多东西我都不懂。

我在显卡内存中有一个 RGBA 格式 (DXGI_FORMAT_R8G8B8A8_UNORM) 的纹理。这是一个截获的游戏缓冲区。 在将其内容复制到计算机内存之前,我需要对这个纹理进行转换 格式为 BGRA (DXGI_FORMAT_B8G8R8A8_UNORM)。如何将纹理从一种像素格式转换为另一种像素格式 显卡的方式?

// DXGI_FORMAT_R8G8B8A8_UNORM
ID3D11Texture2D *pTexture1;

// DXGI_FORMAT_B8G8R8A8_UNORM
ID3D11Texture2D *pTexture2;
D3D11_TEXTURE2D_DESC desc2 = {};
desc2.Width = swapChainDesc.BufferDesc.Width;
desc2.Height = swapChainDesc.BufferDesc.Height;
desc2.MipLevels = 1;
desc2.ArraySize = 1;
desc2.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
desc2.BindFlags = D3D10_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
desc2.SampleDesc.Count = 1;
desc2.Usage = D3D11_USAGE_DEFAULT;
desc2.MiscFlags = 0;

void pixelConvert(ID3D11Texture2D *pTexture1, ID3D11Texture2D *pTexture2)
{
     // 
     // Code....
     //
}

我不明白这个解决方案: DX11 convert pixel format BGRA to RGBA 不完整

【问题讨论】:

标签: c++ directx directx-11


【解决方案1】:

在 GPU 上,简单的解决方案是将纹理作为“全屏四边形”渲染到另一个渲染目标。不需要任何专门的着色​​器,它只是简单的渲染。当你加载纹理时,如果需要,它会被“混合”到标准的红色、绿色和蓝色通道,当你写入渲染目标时,根据格式会发生同样的事情。

请参阅DirectX Tool Kit 中的SpriteBatchthis tutorial,尤其是如果您需要适用于所有Direct3D Hardware Feature Levels 的解决方案。如果您需要D3D_FEATURE_LEVEL_10_0 或更高版本,请参阅PostProcess,它针对您始终将四边形绘制到整个渲染目标这一事实进行了优化。

如果您需要 CPU 解决方案,请参阅DirectXTex

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    相关资源
    最近更新 更多